Flutter路由跳转报type 'Null' is not a subtype of type 'String'错误如何解决
错误原因
这个type 'Null' is not a subtype of type 'String'错误本质是代码中把Null值赋值给了要求String类型的参数/变量,结合你的场景具体原因如下:
- Detail页参数接收逻辑没有做空安全校验:你直接用
as Map强制转换可空的路由参数,如果参数为空或者类型不匹配就会抛出类型错误。 - 数据源存在空值:
dataList_spa和dataList_excursion中部分元素的常用字段(比如PHOTO、LIBELLE、PRICE_AD等Detail页会用到的字段)存在Null值,而dataList_home的对应字段全部非空,所以仅从Spa、Excursion页面跳转时触发报错。 - 小概率触发原因:Spa、Excursion页面跳转时传入的
index越界,导致取到的dataList_spa[index]/dataList_excursion[index]为Null,传入Detail页后取值时触发空类型错误。
修复方案
按以下步骤依次排查修复即可:
1. 优化Detail页参数接收逻辑
将原来强制转换的代码替换为空安全的写法,提前处理参数异常的情况:
Widget build(BuildContext context) { final args = ModalRoute.of(context)?.settings.arguments; // 校验参数类型合法性 if (args is! Map) { Navigator.pop(context); return const Scaffold(body: Center(child: Text('参数异常,返回上一页'))); } final dataMap = args; final previousScreenData = dataMap['previousScreenData'] as Map?; // 校验业务数据合法性 if (previousScreenData == null) { Navigator.pop(context); return const Scaffold(body: Center(child: Text('数据不存在,返回上一页'))); } // 后续业务逻辑使用previousScreenData即可 // ... }
2. 所有字段取值时增加空判断
Detail页中所有从previousScreenData取字段的地方,都做空值兼容,设置兜底默认值:
// 图片链接字段处理 Image( image: NetworkImage(previousScreenData["PHOTO"] as String? ?? "你的占位图链接"), height: 250, fit:BoxFit.fill, ) // 文本字段处理 Text( previousScreenData["LIBELLE"] as String? ?? "暂无名称", ) Text( previousScreenData["PRICE_AD"] as String? ?? "暂无报价", )
3. 排查上游数据源
检查dataList_spa和dataList_excursion的生成逻辑,如果是接口返回的数据,在存入列表前就对空字段做默认值赋值,从源头避免Null值流入下游页面。
4. 校验跳转下标合法性
Spa、Excursion页面跳转前确认index在对应列表的合法下标范围内,避免下标越界取到Null数据。
内容的提问来源于stack exchange,提问作者Majdi Zlitni
相关产品推荐
相关产品推荐

