Flutter嵌套JSON解析报错排查及调试工具咨询
解决Flutter嵌套JSON解析报错:
MappedListIterable不是List<SearchModel>的子类型 我来帮你拆解这个问题,你遇到的类型不匹配报错其实是几个小问题叠加导致的,咱们一步步来解决:
1. 直接触发报错的核心问题
在SearchPagination.fromJson方法里,你对json["values"]使用map方法后,直接把结果赋值给了List<SearchModel>类型的values字段。但map返回的是**MappedListIterable**(一个可迭代对象),并不是List,所以Flutter会抛出类型不匹配的错误。
解决方法很简单:在map后面加上.toList(),把可迭代对象转换成List:
values: json["values"].map((a) => SearchModel.fromJson(a)).toList(),
2. 隐藏的其他解析错误
除了上面的核心问题,你的Model类还有几个小问题会导致解析失败或者数据丢失:
currentPage类型不匹配:你在SearchPagination里把currentPage定义成了String,但JSON里的currentPage是整数类型,要么把变量类型改成int,要么把JSON值转成String(比如json["currentPage"].toString())。SearchModel.fromJson的参数类型错误:你把参数写成了Map<SearchModel, dynamic>,这完全不对,应该是Map<String, dynamic>,否则会导致JSON无法正确映射到模型。- 字段名不匹配:JSON里的ID字段是
"_id",但你在SearchModel.fromJson里取的是json["id"],这样会导致id字段永远为null。
修正后的完整Model类
class SearchPagination { int total; int totalPages; int currentPage; // 改成int类型,和JSON字段类型一致 int perPageRecords; List<SearchModel> values; SearchPagination({this.total, this.totalPages, this.currentPage, this.perPageRecords, this.values}); factory SearchPagination.fromJson(Map<String, dynamic> json) { return SearchPagination( total: json["total"] as int, totalPages: json["totalPages"] as int, currentPage: json["currentPage"] as int, perPageRecords: json["perPageRecords"] as int, values: json["values"].map((a) => SearchModel.fromJson(a)).toList(), // 加上toList()转换 ); } } class SearchModel { final String id; final String name; final String description; final bool deleted; SearchModel({this.id, this.name, this.description, this.deleted}); factory SearchModel.fromJson(Map<String, dynamic> json) { // 修正参数类型 return SearchModel( id: json["_id"], // 匹配JSON的"_id"字段 name: json["name"], description: json["description"] ?? "", // 处理description可能为null的情况 deleted: json["deleted"], ); } }
如何定位错误的具体文件/行号
- 仔细看Flutter的报错日志,除了类型不匹配的提示,下面会有堆栈跟踪信息,里面会明确标出错误发生的具体文件和行号(比如
SearchPagination.fromJson里的values赋值行)。 - 可以在解析代码里插入
print语句,打印中间结果的类型,比如:
这样就能看到输出是print(json["values"].map((a) => SearchModel.fromJson(a)).runtimeType);MappedListIterable<dynamic, dynamic>,从而快速定位问题。
Flutter的逐行调试工具
当然有!Flutter提供了非常好用的逐行调试能力:
- Android Studio/IntelliJ IDEA:在代码行左侧点击设置断点(红色圆点),然后点击运行按钮旁边的「Debug」图标(虫子形状),程序会在断点处暂停。你可以用快捷键逐行执行:F7步入方法、F8步过当前行、F9继续运行,同时在调试面板里查看所有变量的实时值。
- VS Code:打开左侧的调试面板(快捷键Ctrl+Shift+D),设置断点后点击「启动调试」,同样支持逐行执行、变量查看、表达式监视等功能。
- 临时调试还可以用
debugPrint(比print更适合Flutter,不会截断长输出)打印关键变量的类型和值,辅助排查问题。
内容的提问来源于stack exchange,提问作者Sankalp
相关产品推荐
相关产品推荐

