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

