Flutter运行异常Null is not subtype of Map<String,dynamic>排查求助
问题原因
- 核心触发报错的原因是JSON键名大小写不匹配:API返回的JSON中子对象的键是驼峰写法
pageInfo,但你在YouTubeSearchModel.fromJson中用json['pageinfo'](全小写)取值,取不到内容就会返回null,把null传入需要Map<String,dynamic>类型参数的PageInfoData.fromJson方法,就直接抛出了你遇到的类型不匹配异常。 - 存在隐藏的空异常风险:
PageInfoData.fromJson里你取值用的键是resultPerPage,但API返回的JSON中对应键是resultsPerPage(多了一个s),哪怕解决了第一个问题,这里也会取不到值抛出空异常。 - 存在数据赋值错误:
YouTubeSearchModel.fromJson里你把kind和etag的取值逻辑搞反了,etag取了json['kind']的值,kind取了json['etag']的值,虽然不会直接报错,但会导致字段存储数据完全错误。
修复后代码
PageInfoData 类修复
class PageInfoData { final int totalResults; final int resultsPerPage; // 字段名和JSON返回键对齐 PageInfoData({required this.totalResults, required this.resultsPerPage}); factory PageInfoData.fromJson(Map<String,dynamic> json) { return PageInfoData( totalResults: json['totalResults'], resultsPerPage: json['resultsPerPage'], // 取值键名和JSON返回键对齐 ); } }
YouTubeSearchModel 类修复
class YouTubeSearchModel { final String kind; final String etag; final String nextPageToken; final String regionCode; final PageInfoData pageInfo; YouTubeSearchModel({ required this.kind, required this.etag, required this.nextPageToken, required this.regionCode, required this.pageInfo, }); factory YouTubeSearchModel.fromJson(Map<String,dynamic>json){ return YouTubeSearchModel( kind: json['kind'], // 修正反转的赋值逻辑 etag: json['etag'], // 修正反转的赋值逻辑 nextPageToken: json['nextPageToken'], regionCode : json['regionCode'], pageInfo: PageInfoData.fromJson(json['pageInfo']) // 修正键名大小写问题 ); } }
通用排查思路
- 遇到类型不匹配异常时,首先打印传入的原始JSON数据,确认对应键是否存在、键名拼写/大小写是否完全一致。
- 复杂嵌套对象转换前,可以先判断
json['xxx'] != null再做转换,避免空值传入类型要求严格的方法。 - 如果API部分字段可能不存在,要把对应的Dart字段声明为可空类型,或者在取值时通过
??设置默认值,避免空安全相关异常。 - 可以用
json_serializable这类官方序列化库自动生成转换代码,减少手写拼写错误的概率。
内容的提问来源于stack exchange,提问作者M.Hassan
相关产品推荐
相关产品推荐

