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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:48:09