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

