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

Dart类型转换错误:无法将List<dynamic>转为List<Map<String, Object>>

解决Dart中JSON解码后List转List<Map<String, Object>>的类型错误

问题核心在于json.decode返回的是dynamic类型,直接强制转换为List<Map<String, Object>>会触发类型不匹配——Dart不允许直接将嵌套的动态泛型集合强转为具体类型的嵌套集合。

修正方案:手动遍历转换元素

先将解码结果转为List<dynamic>,再逐个把内部元素转为Map<String, Object>:

List<Map<String, Object>> list = [];
list.add({'time': dateStr, 'name': 'summa', 'points': number.toString()});
String? encodedList = json.encode(list);
await prefs.setString('Values', encodedList);

final String? encodedList2 = prefs.getString('Values');
// 先转成List<dynamic>,再遍历转换每个元素
List<dynamic> tempList = json.decode(encodedList2!) as List<dynamic>;
List<Map<String, Object>> decodedList = tempList.map((item) {
  return item as Map<String, Object>;
}).toList();

原理说明

  • json.decode解析JSON数组时,返回的是List<dynamic>,其中每个元素是Map<String, dynamic>类型。
  • Dart的泛型强转仅支持顶层类型转换(比如List<dynamic>转List),嵌套的泛型转换(直接转List<Map<String, Object>>)会被判定为不安全操作,编译器会直接拒绝。
  • 通过map遍历每个元素,将单个dynamic元素强转为Map<String, Object>后再转为List,就能得到目标类型的集合。

简化写法(使用cast)

如果能确认所有元素都符合Map<String, Object>结构,也可以用cast快速转换:

List<Map<String, Object>> decodedList = (json.decode(encodedList2!) as List<dynamic>).cast<Map<String, Object>>();

注意:若JSON中存在不符合Map<String, Object>的元素,这种写法会在运行时抛出错误,仅适用于数据结构确定的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 09:24:57