调用getAssesment()时_InternalLinkedHashMap无法转为AssesmentModel?如何解决
问题根因
json.decode()返回的结果是_InternalLinkedHashMap<String, dynamic>类型的键值对集合,你没有对这个原始解析结果做模型转换,就直接赋值给了声明为AssesmentModel?类型的_assesment属性,Dart的强类型校验不通过,直接抛出类型不匹配异常。
修复代码
修改AssesmentProvider中getAssesment()方法的赋值逻辑,调用你已经实现的AssesmentModel.fromJson序列化构造方法完成类型转换即可:
Future<void> getAssesment() async { try { // AssesmentModel assesment = await AssesmentService().readJson(); var response = await rootBundle.loadString('assets/json/assesment.json'); print('the response: ' + response); var data = json.decode(response); print('assesment in provider'); print(data); // 新增模型转换逻辑 _assesment = AssesmentModel.fromJson(data); } catch (e) { print(e); } }
可选优化点
如果要提升代码鲁棒性,可以给模型类的序列化方法增加缺省值处理,避免JSON字段缺失时报错:
// AssesmentModel的fromJson优化版 AssesmentModel.fromJson(Map<String, dynamic> json) { id = int.tryParse(json['id']?.toString() ?? '0') ?? 0; observerName = json['observerName'] ?? ''; unit = json['unit'] ?? ''; area = AreaModel.fromJson(json['area'] ?? {}); } // AreaModel的fromJson优化版 AreaModel.fromJson(Map<String, dynamic> json) { id = int.tryParse(json['id']?.toString() ?? '0') ?? 0; name = json['name'] ?? ''; }
内容的提问来源于stack exchange,提问作者streetCoder3127917
相关产品推荐
相关产品推荐

