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

Flutter报错:'List' is not a subtype of type 'Map<String, dynamic>' 求助

解决Flutter中'List' is not a subtype of type 'Map<String, dynamic>'错误

这个错误的核心原因是你代码里按Map<String, dynamic>解析数据,但API实际返回的是List类型结构,或是API返回包含List的嵌套Map,但你直接将整体解析成了Map。

第一步:确认API返回的实际结构

先核对你的API返回示例,常见两种情况:

情况A:直接返回数组

[
{"code": "USD", "name": "US Dollar", "rate": 1.0},
{"code": "EUR", "name": "Euro", "rate": 0.92}
]

情况B:返回嵌套了数组的Map

{
"success": true,
"data": [
{"code": "USD", "name": "US Dollar", "rate": 1.0},
{"code": "EUR", "name": "Euro", "rate": 0.92}
]
}

第二步:修改数据解析逻辑

根据API返回结构调整解析代码:

对应情况A的正确写法

如果之前的错误代码是这样:

final response = await http.get(Uri.parse('你的API地址'));
if (response.statusCode == 200) {
  // 错误:把List当成Map解析
  Map<String, dynamic> data = json.decode(response.body);
  Currency currency = Currency.fromJson(data);
}

改成List解析逻辑:

final response = await http.get(Uri.parse('你的API地址'));
if (response.statusCode == 200) {
  // 先转成List<dynamic>
  List<dynamic> dataList = json.decode(response.body);
  // 遍历数组,将每个Map转成Currency对象
  List<Currency> currencies = dataList
      .map((item) => Currency.fromJson(item as Map<String, dynamic>))
      .toList();
  // 后续使用currencies列表即可
}

对应情况B的正确写法

先取出嵌套的List字段再解析:

final response = await http.get(Uri.parse('你的API地址'));
if (response.statusCode == 200) {
  // 先解析外层Map
  Map<String, dynamic> responseMap = json.decode(response.body);
  // 取出里面的data数组
  List<dynamic> dataList = responseMap['data'];
  // 转成Currency列表
  List<Currency> currencies = dataList
      .map((item) => Currency.fromJson(item as Map<String, dynamic>))
      .toList();
}

第三步:确保模型类的fromJson方法正确

你的Currency模型类应该是处理单个Map<String, dynamic>的,示例如下:

class Currency {
  final String code;
  final String name;
  final double rate;

  Currency({required this.code, required this.name, required this.rate});

  // 从单个Map解析成Currency对象
  factory Currency.fromJson(Map<String, dynamic> json) {
    return Currency(
      code: json['code'] ?? '',
      name: json['name'] ?? '',
      rate: (json['rate'] as num).toDouble(),
    );
  }
}

关键注意点

  • 必须严格匹配API返回结构,不要想当然假设是Map还是List
  • 可以先打印json.decode(response.body)的结果,直观确认数据结构
  • 做类型转换时建议加空判断或异常捕获,避免崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:45:22