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

Flutter解析REST API数据调用cast<Map<String,dynamic>>()报错如何解决

错误引发原因
  • 接口返回的JSON结构不符合预期:你调用jsonDecode(responseBody)得到的结果是_InternalLinkedHashMap<String, dynamic>类型的对象,而非你预先假设的数组类型。你直接对Map对象调用仅List支持的数组类型转换逻辑,Map的cast方法仅用于转换自身键值对的类型,无法匹配你传入的参数,因此抛出方法不存在的错误。
  • 解析方法调用参数类型不匹配:ModelEvent.fromJson接收的入参是JSON字符串,而你在遍历过程中传入的是Map<String, dynamic>类型的解析后对象,即使前一个问题修复,也会触发类型不匹配错误。
解决方法

首先确认接口返回的JSON结构,找到事件列表对应的字段:绝大多数业务接口不会直接返回数组,而是返回外层包裹了状态码、消息等字段的对象,事件列表一般存放在data、list这类字段下。

修正后的解析代码示例

情况1:接口返回外层包裹对象(最常见)

List<ModelEvent> parseEvents(String responseBody) {
  // 解码得到外层响应对象
  final Map<String, dynamic> responseMap = jsonDecode(responseBody);
  // 替换字段名为你接口中实际存储事件列表的字段,比如"data"、"records"等
  final List<dynamic> eventRawList = responseMap['data'] as List;
  // 调用fromMap方法直接解析Map类型的单条数据
  return eventRawList.map<ModelEvent>((item) => ModelEvent.fromMap(item)).toList();
}

情况2:接口直接返回事件数组

如果确认接口没有外层包裹,直接返回数组,可使用以下代码:

List<ModelEvent> parseEvents(String responseBody) {
  final List<dynamic> eventRawList = jsonDecode(responseBody) as List;
  return eventRawList.map<ModelEvent>((item) => ModelEvent.fromMap(item)).toList();
}

你原有fetchEvents方法中,setState直接赋值同步方法返回值的逻辑无需额外修改。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 05:15:10