You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter跳转路由报type 'String' is not a subtype of type 'Map<String, String>'错求助

报错原因
  • 核心问题为参数接收阶段的强制类型转换失败:你在代码中使用as Map<String, String>将路由参数强转为指定Map类型时,实际获取到的arguments为String类型,和目标类型不匹配,触发CastError。
  • 常见触发场景:
    • 存在其他入口跳转CategoryMealsScreen路由时,未按要求传递Map结构参数,误传了单个String作为arguments
    • CategoryMealsScreen.routeName常量定义拼写错误,跳转时匹配到其他路由,导致参数结构不匹配
  • 补充说明:ModalRoute.of(context)后的问号是Dart空安全语法,因为该方法可能返回null(比如当前页面不是通过路由栈加载的场景),加问号表示空安全调用,避免空指针异常。
修复方案

1. 新增参数类型校验,避免强制转换崩溃

替换原参数接收逻辑,先做类型判断再走正常业务逻辑,异常场景做兼容处理:

Widget build(BuildContext context) {
  final Object? routeArgs = ModalRoute.of(context)?.settings.arguments;
  // 类型不匹配时走异常兼容逻辑
  if (routeArgs is! Map<String, String>) {
    return Scaffold(
      appBar: AppBar(title: const Text("错误")),
      body: const Center(child: Text("页面参数异常")),
    );
  }
  // 类型校验通过后再取参数
  final categoryId = routeArgs["id"];
  final categoryTitle = routeArgs["title"];
  final categoryMeals = DUMMY_MEALS.where((meal){
    return meal.categories.contains(categoryId);
  }).toList();
  // 原页面剩余渲染逻辑不变
}

2. 排查所有跳转逻辑

检查所有调用Navigator.pushNamed跳转CategoryMealsScreen的代码,确保arguments参数传递的都是{'id':'xxx', 'title':'xxx'}格式的Map,没有仅传递单个String的情况。

3. 核对路由配置

确认CategoryMealsScreen.routeName常量的值,和路由表中注册的对应key完全一致,没有拼写错误导致路由匹配错误。

内容的提问来源于stack exchange,提问作者Mohamed Hesham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 05:57:03