Flutter中如何解析并获取Map<String, List>类型的mySelectedEvents数据?
Flutter解析Map<String, List>类型数据的方法
1. 直接使用原始数据
你给出的mySelectedEvents本身就是Dart原生支持的Map结构,直接声明对应类型后就能直接使用:
Map<String, List<Map<String, String>>> mySelectedEvents = { "2022-09-13": [ {"eventDescp": "11", "eventTitle": "111"}, {"eventDescp": "22", "eventTitle": "22"} ], "2022-09-30": [ {"eventDescp": "22", "eventTitle": "22"} ], "2022-09-20": [ {"eventTitle": "ss", "eventDescp": "ss"} ] };
获取指定日期的事件,或者遍历数据都很直接:
// 获取2022-09-13的所有事件,空值时返回空列表避免报错 List<Map<String, String>> eventsOn13th = mySelectedEvents["2022-09-13"] ?? []; // 遍历该日期的事件 for (var event in eventsOn13th) { print("标题:${event['eventTitle']},描述:${event['eventDescp']}"); }
2. 类型安全优化:创建实体类
如果想避免Map键名拼写错误,让代码更规范,建议创建Event实体类来封装数据:
class Event { final String eventTitle; final String eventDescp; Event({required this.eventTitle, required this.eventDescp}); // 从Map转换为Event对象的工厂方法 factory Event.fromMap(Map<String, dynamic> map) { return Event( eventTitle: map['eventTitle'] ?? '', eventDescp: map['eventDescp'] ?? '', ); } }
接着把原始的Map数据转换成带实体类的Map:
Map<String, List<Event>> typedEvents = {}; mySelectedEvents.forEach((date, eventMaps) { typedEvents[date] = eventMaps.map((map) => Event.fromMap(map)).toList(); });
之后访问数据时,就能通过实体类的属性直接调用,不用再写字符串键名:
List<Event> eventsOn20th = typedEvents["2022-09-20"] ?? []; for (var event in eventsOn20th) { print("标题:${event.eventTitle},描述:${event.eventDescp}"); }
3. 遍历所有日期的事件
如果需要遍历整个Map的所有数据,两种方式都可以实现:
遍历原始Map
mySelectedEvents.forEach((date, events) { print("=== 日期:$date ==="); for (var event in events) { print("- 标题:${event['eventTitle']},描述:${event['eventDescp']}"); } });
遍历带实体类的Map
typedEvents.forEach((date, events) { print("=== 日期:$date ==="); for (var event in events) { print("- 标题:${event.eventTitle},描述:${event.eventDescp}"); } });
内容的提问来源于stack exchange,提问作者msi
相关产品推荐
相关产品推荐

