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

Flutter解析API数据时List<dynamic>不是Map<dynamic,dynamic>子类型错误如何解决

问题原因
  • 你的API返回的是JSON数组(最外层包裹[]),本质是List<dynamic>类型,但你在代码中将jsonDecode的结果直接强转为Map类型,类型不匹配所以抛出该错误。
  • 你的示例返回数据只有1个元素,所以只需要取数组的第一个元素传入AdTemplate.fromJson即可。
修复后的代码

单条数据场景(适配你现有逻辑)

修改网络请求函数即可:

Future<AdTemplate?> getActiveBannerNotif() async {  
    try { 
      String url = 'https://api/path/'; 
      var res = await http.get(url);  
      // 先解析为List类型
      final List data = convert.jsonDecode(res.body);

      if (res.statusCode == 200 && data.isNotEmpty) { 
        print("Data Fetch!");
        // 取数组第一个元素转为Map后传入模型解析方法  
        AdTemplate template = AdTemplate.fromJson(data.first as Map<String, dynamic>);  
        return template;
      } else {
        print('No data.'); 
        return null;
      }
    } catch (e) {
      print(e);
      return null;
    } 
}

多条数据场景(可选优化)

如果接口后续可能返回多条广告模板,可修改返回值为数组类型批量解析:

Future<List<AdTemplate>> getActiveBannerNotif() async {  
    try { 
      String url = 'https://api/path/'; 
      var res = await http.get(url);  
      final List data = convert.jsonDecode(res.body);

      if (res.statusCode == 200) { 
        print("Data Fetch!");    
        return data.map((item) => AdTemplate.fromJson(item as Map<String, dynamic>)).toList();
      } else {
        print('No data.'); 
        return [];
      }
    } catch (e) {
      print(e);
      return [];
    } 
}
补充注意点
  • 解析时建议显式加类型转换as Map<String, dynamic>,避免隐式类型转换报错
  • 若项目开启了空安全,需要给AdTemplate的构造函数参数加上required关键字,或者处理可空逻辑,避免编译错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:54:04