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

Flutter报NoSuchMethodError: getter 'name' was called on null问题求解

问题排查与修复方案

你遇到的NoSuchMethodError: The getter "name" was called on null错误由多个逻辑问题共同导致,具体问题和修复方式如下:

核心问题列表

    1. 空判断语法错误
      getCurrentCarpark方法中的判断语句写为if (_nearbyCarpark = null),这里是赋值运算符=而非相等判断运算符==,会强制把_nearbyCarpark设为null,即使之前匹配到了附近停车场也会被覆盖。
    1. 异步方法未等待
      initialisation方法中调用的getCurrentLoc是异步方法,你没有加await关键字,导致执行getCurrentCarpark时,用户经纬度还没获取到,一直是初始值0,大概率匹配不到任何停车场。同时你把initialisation放在build方法中执行,加上FutureBuilder也在调用readFromFirebase2,会导致重复多次请求Firebase和定位接口。
    1. 渲染时未做空判断
      布局中直接写Text(nearbyCarpark.name),异步逻辑未执行完成时nearbyCarpark是null,直接访问name属性就会抛出你遇到的报错。
    1. 兜底逻辑没有异常处理
      使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:57:02