You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 11:45:57