我有一个使用映射的联系人模型,但返回为null,因此导致aysnc暂停。我曾尝试将这些地图设置为返回空列表,但没有成功解决问题。
ContactModel{
//factory method constructor
emails: List<Email>.from(parsedJson['Emails'].map((x)=>Email.fromJson(x))),
tasks: List<Tasks>.from(parsedJson["Tasks"].map((x) => Tasks.fromJson(x))),
notes: List<Notes>.from(parsedJson["Notes"].map((x) => Notes.fromJson(x))),
}
错误返回为:没有在null上调用这样的方法映射。接收器空
我试着把它写成来解决这个问题
ContactModel{
//factory method constructor
emails: List<Email>.from(parsedJson['Emails'].map((x)=>Email.fromJson(x))).toList() ?? [],
tasks: List<Tasks>.from(parsedJson["Tasks"].map((x) => Tasks.fromJson(x))).toList() ?? [],
notes: List<Notes>.from(parsedJson["Notes"].map((x) => Notes.fromJson(x))).toList() ?? [],
}
您可以尝试null
检查json,如下所示:
ContactModel{
emails: parsedJson['Emails'] != null ? List<Email>.from(parsedJson['Emails'].map((x)=>Email.fromJson(x))).toList() : [],
tasks: parsedJson['Tasks'] != null ? List<Tasks>.from(parsedJson["Tasks"].map((x) => Tasks.fromJson(x))).toList() : [],
notes:parsedJson['Notes'] != null ? List<Notes>.from(parsedJson["Notes"].map((x) => Notes.fromJson(x))).toList() : [],
}
基本上,在处理JSON类型时,我总是检查两件事:
- 您必须检查您的JSON是否包含您要查找的密钥
- 如果键存在,则必须检查返回的null值
我建议你这样做双重检查:
if(parsedJson.isNotEmpty) {
List<dynamic> emails = [];
if (parsedJson.containsKey('Email') && parsedJson['Email'] is List) {
emails = List<Email>.from(parsedJson['Emails'].map((x)=>Email.fromJson(x)))
}
ContactModel({emails: emails});
}
通过这种方式,您总是确保您拥有正确的类型,并避免生产错误(想象一下您的API会疯掉(。我知道它更详细,但对我来说,好的代码需要准确的