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

Flutter应用运行抛出NoSuchMethodError: getter 'siteId'在null上被调用如何解决

问题根因
  • 报错的核心原因是_personnelAuditController.getPersonnelAuditListById(a.idPersonnelAudit)异步方法返回了null,导致then回调中接收的参数_为空,调用_.siteId时触发空指针异常。
  • 现有代码包裹的try-catch只能捕获同步代码异常,异步回调内抛出的异常无法被捕获,所以直接抛出未处理异常。
  • 循环嵌套异步回调没有做顺序控制,_titles的存储顺序会和audites的原始顺序不一致,长度判断逻辑极易触发时序错误。
修复方案
  1. 改用async/await写法替代多层then回调,既避免回调地狱,也能让try-catch覆盖异步异常。
  2. 新增空值校验逻辑,所有异步返回值先做非空判断再调用属性和方法,从根源避免空指针异常。
  3. 用Future.wait控制批量异步任务的返回顺序,保证_titles和原始列表顺序一致,同时统一做状态更新,减少不必要的页面重绘。

修改后的参考代码如下:

_getTitles() async {
  try {
    // 批量处理异步任务,保证返回顺序和原始audites顺序一致
    final tempTitles = await Future.wait(audites.map((Audite a) async {
      // 用await接收异步返回值,逻辑更清晰
      final auditInfo = await _personnelAuditController.getPersonnelAuditListById(a.idPersonnelAudit);
      // 空值拦截,避免后续空调用
      if (auditInfo == null || auditInfo.siteId == null) {
        return "未知审核项";
      }
      final siteInfo = await _siteController.getSite(auditInfo.siteId);
      // 站点信息也做空兼容,避免二次空指针
      return "${auditInfo.nom}  (${siteInfo?.nom ?? '未知站点'})";
    }).toList());
    // 所有异步任务完成后一次性更新状态
    setState(() {
      _titles = tempTitles;
    });
  } catch (e) {
    // 现在同步+异步异常都可以被正常捕获
    _showAlertDialog('Opération non supportée', "Erreur : " + e.toString());
  }
}

额外排查点

如果修改后仍出现异步返回值为null的情况,优先检查以下两点:

  • 入参a.idPersonnelAudit是否为有效值,是否存在空值传递的情况
  • getPersonnelAuditListById方法内部的接口请求、数据解析逻辑是否有错误,是否存在异常时返回null的情况

内容的提问来源于stack exchange,提问作者Youssef Bouazati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:18:01