Flutter解析事件数组报错:_InternalLinkedHashMap无法转为Iterable
问题解决:type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'Iterable'
错误原因
你的网络请求返回的数据结构和本地mySelectedEvents一致,是以日期为键、事件数组为值的Map,但你直接用for (var event in mySelectedEvents)遍历Map,而Map本身不是Iterable类型,导致类型转换错误。
正确解析步骤
1. 优化模型类(可选但推荐)
给Event类添加工厂构造函数,简化从JSON数据创建实例的过程:
class Event { String date; String descript; String title; Event( this.date, this.descript, this.title, ); // 新增工厂构造函数,从JSON生成Event实例 factory Event.fromJson(String date, Map<String, dynamic> json) { return Event( date, json['eventDescp'] ?? '', // 对应本地数据的eventDescp字段 json['eventTitle'] ?? '', // 对应本地数据的eventTitle字段 ); } }
2. 修正getData方法
遍历Map的键值对,逐个解析每个日期下的事件,最终收集为List<Event>:
Future<List<Event>> getData() async { var url = 'xxxxxxx'; var res = await http.get(Uri.parse(url)); // 解析后是Map<String, dynamic>,键是日期,值是事件数组 Map<String, dynamic> mySelectedEvents = json.decode(res.body); List<Event> eventList = []; // 遍历Map的每个键值对 mySelectedEvents.forEach((date, events) { // events是该日期下的事件数组,遍历每个事件 for (var eventJson in events) { // 用工厂构造函数创建Event实例,加入列表 eventList.add(Event.fromJson(date, eventJson)); // 打印测试 print(eventJson["eventDescp"]); print(eventJson["eventTitle"]); } }); return eventList; }
关键注意点
- 不要直接遍历
mySelectedEvents,需通过forEach或entries(如for (var entry in mySelectedEvents.entries))遍历Map的键值对 - 网络返回的字段名要和本地数据完全匹配:是
eventDescp和eventTitle,而非你之前代码里的descript或title
内容的提问来源于stack exchange,提问作者msi
相关产品推荐
相关产品推荐

