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

Flutter路由跳转报type 'Null' is not a subtype of type 'String'错误如何解决

错误原因

这个type 'Null' is not a subtype of type 'String'错误本质是代码中把Null值赋值给了要求String类型的参数/变量,结合你的场景具体原因如下:

  1. Detail页参数接收逻辑没有做空安全校验:你直接用as Map强制转换可空的路由参数,如果参数为空或者类型不匹配就会抛出类型错误。
  2. 数据源存在空值:dataList_spa和dataList_excursion中部分元素的常用字段(比如PHOTO、LIBELLE、PRICE_AD等Detail页会用到的字段)存在Null值,而dataList_home的对应字段全部非空,所以仅从Spa、Excursion页面跳转时触发报错。
  3. 小概率触发原因: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:18:02