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

Flutter开发报错:List<dynamic>无法转为Iterable<Map<dynamic,dynamic>>

解决Flutter类型转换错误:type 'List<dynamic>' is not a subtype of type 'Iterable<Map<dynamic, dynamic>>'

错误原因

json.decode(res.body)返回的是List<dynamic>类型,而groupBy函数期望接收元素为Map<dynamic, dynamic>的可迭代对象,动态类型无法被自动推断为目标类型,导致类型不匹配报错。

修复方案

显式将response转换为List<Map<dynamic, dynamic>>,让Dart明确集合内元素的类型,提供两种实现方式:

方式1:解码时直接做类型断言

修改解码代码,给json.decode的结果加上类型断言:

void getData() async {
    var url = 'http://xxxxxxx/getEvents.php';
    var res = await http.get(Uri.parse(url));
    // 显式转换为List<Map<dynamic, dynamic>>
    var response = json.decode(res.body) as List<Map<dynamic, dynamic>>;
    print(response);

    var mySelectedEvents =
        groupBy(response, (Map obj) => obj['date']).map((k, v) => MapEntry(
            k,
            v.map((item) {
              item.remove('date');
              return item;
            }).toList()));
    print(mySelectedEvents);
}

方式2:传入groupBy前转换类型

如果不想修改解码语句,也可以在传入groupBy时通过cast方法转换类型:

void getData() async {
    var url = 'http://xxxxxxx/getEvents.php';
    var res = await http.get(Uri.parse(url));
    var response = json.decode(res.body);
    print(response);

    var mySelectedEvents =
        // 先将response转换为Iterable<Map<dynamic, dynamic>>
        groupBy(response.cast<Map<dynamic, dynamic>>(), (Map obj) => obj['date']).map((k, v) => MapEntry(
            k,
            v.map((item) {
              item.remove('date');
              return item;
            }).toList()));
    print(mySelectedEvents);
}

额外优化建议

如果接口返回的字段都是字符串类型的键,建议使用Map<String, dynamic>替代Map<dynamic, dynamic>,类型更严谨,能避免后续更多类型相关问题,修改后的类型断言为:

var response = json.decode(res.body) as List<Map<String, dynamic>>;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:15:36