Flutter类型转换错误:_Map<String,dynamic>无法转为String问题排查
错误原因分析
你遇到的CastError是因为将_Map<String, dynamic>类型的值赋值给了期望String类型的字段。具体看代码里的这一行:
id: jsonList[key],
API返回的jsonList[key]是一个完整的货币信息对象(Map类型),但你的Currency类的id字段应该是字符串类型(比如货币代码,也就是循环里的key值,比如"usd"、"eur"这类),把Map赋值给String类型的字段自然会触发类型转换错误。
修复方案
- 修正
id字段的赋值:把id: jsonList[key]改成id: key,因为循环的key就是每个货币的唯一标识(字符串类型),符合id字段的类型要求。 - 添加类型注解规范代码:给变量加上明确的类型注解,避免类型推断带来的潜在问题。
修改后的完整代码片段:
class _HomeState extends State<Home> { // 明确指定列表类型为Currency List<Currency> currency = []; Future getResponse(BuildContext context) async { var url = "http://api.navasan.tech/latest/?api_key=freeTFyHoFiXvgG6UNOlQHfehDasa7eK"; var response = await http.get(Uri.parse(url)); developer.log(response.body, name: 'main'); developer.log('getResponse', name: 'wlifecycle'); if (currency.isEmpty) { if (response.statusCode == 200) { _showSnackBar(context, 'به روز رسانی با موفقیت انجام شد .'); developer.log(response.body, name: 'getResponse', error: convert.jsonDecode(response.body)); // 明确指定Map的类型 Map<String, dynamic> jsonList = convert.jsonDecode(response.body); if (jsonList.isNotEmpty) { jsonList.forEach((key, value) { setState(() { currency.add(Currency( id: key, // 这里改为key,对应字符串类型的货币代码 value: value["value"], // 直接用循环里的value,不用jsonList[key] change: value["change"], timestamp: value['timestamp'], date: value["date"])); }); }); } } } return response; } }
另外,循环里的value就是当前key对应的Map对象,直接用value["xxx"]比jsonList[key]["xxx"]更简洁高效。
额外建议
- 确保你的
Currency类的各个字段类型和API返回的字段类型匹配,比如value、change可能是num类型,timestamp是int类型,date是String类型。 - 可以使用json_serializable库来自动解析JSON,减少手动解析的错误。
内容的提问来源于stack exchange,提问作者Pooyanha
相关产品推荐
相关产品推荐

