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
相关产品推荐
相关产品推荐

