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

Flutter 2中如何将List<dynamic>转换为List<Map<String, String>>?

问题根因

Dart的json.decode方法返回的JSON结构所有叶子节点默认都是dynamic类型,你读取到的JSON数组内部的每个对象类型为_InternalLinkedHashMap<String, dynamic>,Dart强类型模式不允许直接将该类型赋值给Map<String, String>类型的变量,仅对List做外层类型声明不会自动处理内层元素的类型转换。

可行解决方案

方案1(确定JSON所有值均为字符串时使用)

直接对每个内层Map做类型转换即可:

Future<void> _readJson() async {
  final String response = await rootBundle.loadString('lib/assets/vocabulary.json');
  // 注意:json.decode是同步方法,不需要加await
  final List<dynamic> data = json.decode(response);
  // 逐层转换类型
  _words = data.map((dynamic item) => Map<String, String>.from(item)).toList();
}

方案2(兼容值可能为非字符串的场景)

如果无法保证JSON中所有值都是字符串,可以显式调用toString()做类型转换,避免运行时异常:

Future<void> _readJson() async {
  final String response = await rootBundle.loadString('lib/assets/vocabulary.json');
  final List<dynamic> data = json.decode(response);
  _words = data.map((dynamic item) {
    return item.map<String, String>(
      (key, value) => MapEntry(key, value.toString()),
    );
  }).toList();
}
原代码错误点

你之前的写法List<Map<String, String>>.from(data)仅校验了顶层List的元素是否为Map类型,不会自动转换Map内部的值类型,因此触发类型不匹配报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:12:03