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

Flutter类型不匹配:首次构建数据转换失败,重启后恢复正常

问题分析与解决

报错根源

你遇到的类型不匹配问题,核心原因是fromJson(json)方法返回的是可空类型NotificationModel?,但map<T>方法要求传入的回调必须返回非空的T(这里T是NotificationModel),两者类型不兼容,导致首次解析异常数据时触发类型错误。

至于首次运行失败、重启后恢复的现象,大概率是首次加载时接口返回的JSON数据存在格式问题(比如字段缺失、值类型错误),让fromJson返回了null;重启后可能接口返回了正常数据,或者本地缓存了合法数据,fromJson能返回非空的NotificationModel,类型匹配后功能就正常了。但这只是临时现象,本质问题得从代码层面修复。

修复方案

根据你的业务需求,有两种可行的修复方式:

方案1:允许列表中存在可空模型

如果业务允许列表里出现null(比如解析失败的项保留为null),可以修改fromJsonList的泛型签名,让它返回List<T?>?:

List<T?>? fromJsonList(dynamic jsonList) {
    try {
      return jsonList?.map<T?>((dynamic json) => fromJson(json))?.toList();
    } catch (e) {
      debugPrint("fromJsonList_Err: ${e.toString()}");
      return null;
    }
  }

方案2:确保fromJson返回非空模型

如果业务要求所有解析后的模型都必须非空,那就修改fromJson方法,让它在解析失败时抛出异常而不是返回null:

// 修改fromJson方法示例
NotificationModel fromJson(dynamic json) {
  if (json == null || json["required_field"] == null) {
    throw Exception("Invalid JSON data for NotificationModel");
  }
  // 正常解析逻辑
  return NotificationModel(
    // 填充字段
  );
}

这样fromJsonList的原有代码就能正常工作——解析失败时异常会被try-catch捕获,返回null,不会触发类型不匹配的问题。

内容的提问来源于stack exchange,提问作者Bilguun Bilegbaatar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:17:23