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

