Flutter报错:'(dynamic) => Null'非'(String, dynamic)'子类型及null调用vendorDocList
报错原因
两个报错分别对应不同的代码问题:
- 第一个错误
Unhandled Exception: type '(dynamic) => Null' is not a subtype of type '(String, dynamic) => void' of 'f':是getVendorsDoc.fromJson方法中直接遍历json['data']导致的。如果后端返回的data字段为null、不是数组类型,或者data是Map类型,Map的forEach需要传入接收两个参数(key、value)的回调,你当前传入的只有一个参数的回调就会触发类型不匹配异常。 - 第二个错误
The getter 'vendorDocList' was called on null:有三个触发场景:1. 接口请求失败没有捕获异常,导致你拿到的getVendorsDoc实例为null,直接调用属性就会报错;2.getVendorsDoc.toJson方法中注释了vendorDocList的非空判断,当vendorDocList为null时调用.map方法触发报错;3.VendorDocList.toJson方法没有返回值,序列化异常会导致实例生成失败。
修复方案
按以下步骤修改代码即可:
- 修正
getVendorsDoc.fromJson方法,增加字段类型、非空判断:
getVendorsDoc.fromJson(Map<String, dynamic> json) { status = json['status']; msg = json['message']; vendorDocList = []; // 先校验data字段的有效性再遍历 if (json['data'] != null && json['data'] is List) { json['data'].forEach((v) { vendorDocList.add(VendorDocList.fromJson(v)); }); } }
- 修正
getVendorsDoc.toJson方法,恢复非空校验:
Map<String, dynamic> toJson() { final Map<String, dynamic> data = <String, dynamic>{}; data['status'] = status; data['message'] = msg; // 保留非空判断,避免null调用map方法 if (vendorDocList != null) { data['data'] = vendorDocList?.map((v) => v.toJson())?.toList(); } return data; }
- 修正
VendorDocList.toJson方法,补充返回值:
Map<String, dynamic> toJson() { final Map<String, dynamic> data = <String, dynamic>{}; data['logo'] = logo; return data; }
- 接口调用处补充异常捕获,调用属性前先校验实例非空:
try { getVendorsDoc res = await VendorsDocument().getVendorDocList("替换为实际传参的lead_id"); if (res != null) { // 再操作res.vendorDocList } } catch(e) { print("请求异常:$e"); }
- 修正请求头的笔误:你当前
authorizationHeader的取值多了一个多余的闭合大括号,把'Bearer $accessToken}'修改为'Bearer $accessToken'。 - 如果你的项目开启了空安全,需要给所有可能为空的属性加上可空标记
?:
class getVendorsDoc { bool? status; String? msg; List<VendorDocList>? vendorDocList; // 其余代码不变 } class VendorDocList { String? logo; // 其余代码不变 }
内容的提问来源于stack exchange,提问作者Abhishek Pandey
相关产品推荐
相关产品推荐

