Flutter报错NoSuchMethodError:空对象调用map方法数据解析失败
问题原因
- 核心报错来自数据模型的
GetSampah.fromMap解析逻辑:代码直接对json["result"]调用map方法,当接口返回的result字段为null时,null对象不存在map方法,就会抛出你遇到的报错。 - 代码中存在多处强制解包可空字段的隐患:比如UI层监听
con.resSampah时直接用value.result!、数据模型toMap方法直接用result!.map,当对应字段为null时都会触发空异常。 - UI层的列表刷新逻辑存在错误:原有逻辑判断
_listSampah不为空时仅清空列表,不加载新数据,会导致后续刷新无法拿到最新数据。
修复方案
1. 修复数据模型的空安全问题
修改GetSampah类的fromMap和toMap方法,对可空的result字段做兼容处理:
factory GetSampah.fromMap(Map<String, dynamic> json) => GetSampah( hasil: json["hasil"], // 新增null判断,result为null时返回空数组 result: json["result"] == null ? [] : List<Result>.from(json["result"]!.map((x) => Result.fromMap(x))), ); Map<String, dynamic> toMap() => { "hasil": hasil, // 新增null判断,result为null时返回空数组 "result": result == null ? [] : List<dynamic>.from(result!.map((x) => x.toMap())), };
2. 修复UI层的监听逻辑
修改initState中con.resSampah的监听代码,删除错误的列表判断逻辑,新增非空判断:
con.resSampah.listen((value) { // 先对result做非空兼容,null时用空数组替代 final resultList = value.result ?? []; for (var i = 0; i < resultList.length; i++) { qtyList.add(0); postDetail.add(0); namaSampah.add(0); hargaSetor.add(0); totalHarga.add(0); } if (mounted) { setState(() { _listSampah.clear(); _listSampah.addAll(resultList); _listSearch = _listSampah; }); } });
3. 可选优化(避免其他潜在报错)
修复搜索功能不生效的问题
修改TextField的onChanged逻辑,过滤后的值要赋值给_listSearch同时触发刷新:
onChanged: (value) { setState(() { _listSearch = _listSampah.where((element) { final sampah = element.nama?.toLowerCase() ?? ''; return sampah.contains(value.toLowerCase()); }).toList(); }); }
兼容总价空数组报错
修改总价显示逻辑,避免totalHarga为空时调用reduce抛出异常:
Text( "Rp. ${totalHarga.isEmpty ? 0 : totalHarga.reduce((a, b) => a + b)}", style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold), )
内容的提问来源于stack exchange,提问作者Dimas Maulana Firdaus
相关产品推荐
相关产品推荐

