Flutter中Freezed生成的fromJson方法出现DateTime转String类型转换错误
问题:Freezed模型fromJson时出现DateTime与String类型转换错误
我用Freezed库管理远程DTO类和UI模型,其中LifeDiagnosisResult的DTO和UI模型只有createdAt字段有差异。因为后端还没搭好,我用SharedPreference存储数据,存入时用jsonEncode存列表数据,取出时用jsonDecode得到Map对象。为了得到目标列表对象,我写了这段代码:
void _handleListResponseSuccess(List<String> response) { List<LifeDiagnosisResultUiModel>? uiModelList = response.map((e) { Map<String, dynamic> map = jsonDecode(e) as Map<String, dynamic>; map['createdAt'] = DateTime.now(); return LifeDiagnosisResultUiModel.fromJson(map); }).toList(); if (uiModelList.isNotEmpty) { setLifeDiagnosisResultUiModel(uiModelList[uiModelList.length - 1]); } _rxList(uiModelList); }
运行时触发类型转换错误,错误信息:
error type 'DateTime' is not a subtype of type 'String' in type cast
我的UI模型的createdAt字段是DateTime类型,推测是Map里的createdAt无法匹配UI模型的对应字段,但不清楚具体原因,请问问题出在哪里?
原因与解决方案
问题根源
你给map的createdAt赋值了DateTime.now()这个DateTime对象,但Freezed生成的LifeDiagnosisResultUiModel.fromJson方法,对于DateTime类型的字段,默认是从字符串格式的时间值(比如ISO8601格式)解析而来的。当你把DateTime对象传入fromJson时,内部会尝试将其当作String类型进行转换,于是触发了类型不匹配的错误。
解决方法
把DateTime对象转换成标准的ISO8601格式字符串,再赋值给map的createdAt字段,这样Freezed的fromJson就能正确解析为DateTime类型:
修改代码中的赋值行:
map['createdAt'] = DateTime.now().toIso8601String();
如果你的UI模型是通过Freezed的@JsonKey自定义了解析规则,也可以对应调整,但使用标准ISO8601字符串是最通用的方案。
内容的提问来源于stack exchange,提问作者Jun
相关产品推荐
相关产品推荐

