Flutter应用运行抛出NoSuchMethodError: getter 'siteId'在null上被调用如何解决
问题根因
- 报错的核心原因是
_personnelAuditController.getPersonnelAuditListById(a.idPersonnelAudit)异步方法返回了null,导致then回调中接收的参数_为空,调用_.siteId时触发空指针异常。 - 现有代码包裹的try-catch只能捕获同步代码异常,异步回调内抛出的异常无法被捕获,所以直接抛出未处理异常。
- 循环嵌套异步回调没有做顺序控制,
_titles的存储顺序会和audites的原始顺序不一致,长度判断逻辑极易触发时序错误。
修复方案
- 改用async/await写法替代多层then回调,既避免回调地狱,也能让try-catch覆盖异步异常。
- 新增空值校验逻辑,所有异步返回值先做非空判断再调用属性和方法,从根源避免空指针异常。
- 用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
相关产品推荐
相关产品推荐

