Flutter报NoSuchMethodError: getter 'name' was called on null问题求解
问题排查与修复方案
你遇到的NoSuchMethodError: The getter "name" was called on null错误由多个逻辑问题共同导致,具体问题和修复方式如下:
核心问题列表
- 空判断语法错误
getCurrentCarpark方法中的判断语句写为if (_nearbyCarpark = null),这里是赋值运算符=而非相等判断运算符==,会强制把_nearbyCarpark设为null,即使之前匹配到了附近停车场也会被覆盖。
- 空判断语法错误
- 异步方法未等待
initialisation方法中调用的getCurrentLoc是异步方法,你没有加await关键字,导致执行getCurrentCarpark时,用户经纬度还没获取到,一直是初始值0,大概率匹配不到任何停车场。同时你把initialisation放在build方法中执行,加上FutureBuilder也在调用readFromFirebase2,会导致重复多次请求Firebase和定位接口。
- 异步方法未等待
- 渲染时未做空判断
布局中直接写Text(nearbyCarpark.name),异步逻辑未执行完成时nearbyCarpark是null,直接访问name属性就会抛出你遇到的报错。
- 渲染时未做空判断
- 兜底逻辑没有异常处理
使用carparkList.firstWhere((carpark) => carpark.name == 'Home')时,如果数据库中没有名为「Home」的停车场,firstWhere会直接抛出不存在的异常,没有兜底逻辑。
- 兜底逻辑没有异常处理
修复代码示例
1. 修正getCurrentCarpark方法
void getCurrentCarpark() { Carpark? _nearbyCarpark; // 声明为可空类型 for (Carpark cp in carparkList) { print(cp.name); if (distanceBetween(cp.lat, cp.long, latitude, longitude) < 1) { // 距离在1公里以内 _nearbyCarpark = cp; break; // 匹配到后可以直接跳出循环 } } // 把=改成==,判断是否为空 if (_nearbyCarpark == null) { // 若当前位置未匹配到数据库内停车场,将「Home」设为当前停车场,加orElse兜底 _nearbyCarpark = carparkList.firstWhere( (carpark) => carpark.name == 'Home', orElse: () => Carpark('Home', '', '', 0, 0, '', '', '', ''), // 按你的Carpark构造函数参数补全兜底值 ); } // 赋值后触发重渲染 setState(() { nearbyCarpark = _nearbyCarpark; }); }
2. 修正initialisation方法和调用逻辑
Future<void> initialisation() async { await readFromFirebase2(); await getCurrentLoc(); // 加await等待定位完成 getCurrentCarpark(); } // 把initialisation从build方法移到initState里,避免重复执行 @override void initState() { super.initState(); initialisation(); }
3. 修正布局渲染逻辑,做空判断
// FutureBuilder里的Text组件改成空安全写法 nearbyCarpark != null ? Text( nearbyCarpark!.name, style: knearbyCarparkTextStyle, ) : const CircularProgressIndicator(), // 加载中显示进度条
4. 给getCurrentLoc加上Future返回值
Future<void> getCurrentLoc() async { // 原有逻辑保持不变 }
额外优化建议
你可以删掉build方法里的initialisation()调用,以及FutureBuilder的重复readFromFirebase2()调用,避免重复请求数据库。
内容的提问来源于stack exchange,提问作者L M
相关产品推荐
相关产品推荐

