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

调用API读取数据时遭遇_TypeError:_InternalLinkedHashMap<String, dynamic>不是List<dynamic>的子类型,求解决思路

解决思路:TypeError (type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List')

这个错误在Flutter/ Dart调用API时太常见了——说白了就是你的代码盼着接收一个List(列表)类型的数据,但API实际返回给你的却是一个Map(键值对字典),类型不匹配直接触发了这个报错。下面给你一步步拆解排查和解决的方法:

1. 先搞清楚API到底返回了啥

别猜,直接把API返回的原始数据打出来看真相!可以在请求代码里加一行打印,或者用调试工具抓包:

// 示例:打印API响应的原始内容
final response = await http.get(Uri.parse('你的目标API地址'));
print('API返回的原始数据:${response.body}');

举个例子,如果返回的是这种结构:{"code":200, "data": [{"id":1, "title":"xxx"}, {"id":2, "title":"yyy"}]},那外层是Map,真正的列表数据藏在data字段里;但如果你的代码直接把整个响应结果当成List来解析,必然会报错。

2. 检查数据解析的逻辑是否错位

假设你之前的解析代码是这种错误写法:

// 错误示例:直接把整个Map转成List
List<YourDataModel> dataList = List<YourDataModel>.from(
  json.decode(response.body).map((item) => YourDataModel.fromJson(item))
);

那正确的做法应该是先从Map里取出对应的List字段,再做解析:

// 正确示例:先拿Map里的List字段再解析
final Map<String, dynamic> responseMap = json.decode(response.body);
List<YourDataModel> dataList = List<YourDataModel>.from(
  responseMap['data'].map((item) => YourDataModel.fromJson(item))
);

如果API返回的本身就是纯List(比如[{"id":1}, {"id":2}]),那你得反过来排查是不是代码里误把它当成Map来处理了。

3. 核对模型类的fromJson方法

还要确认你的数据模型类有没有写对,fromJson方法应该是接收单个Map来初始化的,比如:

class YourDataModel {
  final int id;
  final String title;

  YourDataModel({required this.id, required this.title});

  factory YourDataModel.fromJson(Map<String, dynamic> json) {
    return YourDataModel(
      id: json['id'],
      title: json['title'],
    );
  }
}

要是fromJson方法错误地期望接收List,那也会触发类型不匹配的问题。

4. 调试时的小技巧:提前做类型判断

可以在解析前加个类型判断,避免直接报错,还能快速定位问题:

final decodedData = json.decode(response.body);
if (decodedData is List) {
  // 走List类型的解析逻辑
} else if (decodedData is Map) {
  // 走Map类型的解析逻辑,取出里面的List字段
} else {
  print('API返回的数据类型完全不符合预期,请核对接口文档!');
}

内容的提问来源于stack exchange,提问作者Nicolas Poveda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:13:10