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
相关产品推荐
相关产品推荐

