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

Flutter报错:'[]'方法无法无条件调用 接收器可能为null(第35行data['location'])

Flutter空安全下标调用报错解决方案

报错信息

报错指向代码第35行data['location'],原始报错提示:

The method '[]' can't be unconditionally invoked because the receiver can be 'null'

中文含义:无法无条件调用[]方法,因为调用该方法的对象可能为null。

报错根因

  • ModalRoute.of(context)!.settings.arguments的返回类型是Object?,本身允许为null,Dart空安全机制禁止对可空对象直接调用下标取值方法。
  • 即使路由参数不为null,返回值也没有被明确声明为Map类型,直接使用下标操作不符合类型检查规则。
  • 类中定义的Map data = {}被build方法内的同名局部变量完全遮蔽,实际参与运算的是未做类型、空值校验的路由参数变量。

修复代码

直接替换原有build方法逻辑即可,修改点包括类型强转、空值兜底、取值兜底:

@override
Widget build(BuildContext context) {
  // 类型转换+空兜底:路由参数为空时默认使用空Map
  final Map data = ModalRoute.of(context)?.settings.arguments as Map? ?? {};
  print(data);

  return Scaffold(
    body: SafeArea(
        child: Column(
          children: <Widget>[
            TextButton.icon(
              onPressed: () {
                Navigator.pushNamed(context, '/location');
              },
              icon: Icon(Icons.edit_location),
              label: Text('Edit Location'),
            ),
            SizedBox(height: 20.0),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  // 取值兜底:key不存在时返回空字符串,避免Text组件接收到null
                  data['location'] ?? '',
                  style: TextStyle(
                    fontSize: 20.0,
                    letterSpacing: 2.0,
                  ),
                ),
              ],
            )
          ],
        )
    ),
  );
}

修改说明

  • 将ModalRoute.of(context)!的强制非空改为可空调用?,配合as Map? ?? {}逻辑,当路由不存在、路由参数为null时,data默认赋值为空Map,彻底解决调用方为null的问题。
  • 显式声明data类型为Map,通过Dart类型检查,允许下标操作。
  • 给data['location']增加空值兜底?? '',即使Map中不存在location字段,也会返回空字符串,不会触发组件传空报错。
  • 类中原本定义的Map data = {};因为被局部变量遮蔽没有实际作用,可以直接删除减少冗余代码。

内容的提问来源于stack exchange,提问作者Ayodeji Onibuje

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:39:19