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
相关产品推荐
相关产品推荐

