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

Flutter解析汇率API时报List<dynamic>无法赋值给List<String>错误怎么解决

问题根因

json.decode()返回的所有数据默认都是dynamic类型,你声明的Map curMap实际是Map<dynamic, dynamic>类型,它的keys属性是Iterable<dynamic>,调用toList()后得到的是List<dynamic>,自然不能直接赋值给声明为List<String>的currencies变量。你之前只用as Map转换只处理了Map本身的类型,没有对键的类型做校验和转换,所以没有解决问题。

解决方案

方案1:显式转换键的类型(最稳妥)

直接对keys做类型映射转换,确保每个键都是String类型:

Future<String> _loadCurrencies() async {
  String uri = "http://api.exchangeratesapi.io/latest?access_key=apikey";
  var response =
      await http.get(Uri.parse(uri), headers: {"Accept": "application/json"});
  var responseBody = json.decode(response.body);
  // 先把rates转成Map<String, dynamic>,确保键是String类型
  Map<String, dynamic> curMap = Map<String, dynamic>.from(responseBody['rates']);
  // 此时keys就是Iterable<String>,转List就是List<String>
  currencies = curMap.keys.toList();
  setState(() {});
  print(currencies);
  return "Success";
}

这里用Map<String, dynamic>.from()会遍历原Map的所有键,校验并转换为String类型,如果遇到非String的键会抛出明确错误,方便排查接口返回异常的情况。

方案2:对List做强制类型转换(适用于确定接口返回的键一定是String的场景)

如果能100%保证接口返回的rates字段的键都是字符串格式,可以直接对List做类型转换:

currencies = curMap.keys.toList().cast<String>();

额外注意点

  • 建议给所有从json解析出来的变量显式声明类型,不要用var或者无泛型的Map,避免隐式类型问题
  • 如果线上环境接口可能出现异常返回,建议加try-catch捕获类型转换错误,避免APP直接崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:06:02