Flutter从数据库获取数据无法生成目标分组Map格式问题
问题描述
我需要生成一个以日期字符串为键、事件对象列表为值的Map结构,示例结构如下:
loadPreviousEvents() { 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"} ] }; print(mySelectedEvents); }
现在我从数据库获取数据后无法生成该结构,当前代码如下:
@override void initState() { super.initState(); _selectedDate = _focusedDay; loadPreviousEvents(); } Future<void> loadPreviousEvents() async { final res = await dbRequest(); print(res); final mySelectedEvents = (res.map((e) => GroupBy.fromJson(e))).toList(); print(mySelectedEvents); } Future<List<dynamic>> dbRequest() async { var url = 'http://xxxxxxxxxx/getEvents.php'; var res = await http.get(Uri.parse(url)); var response = json.decode(res.body); return response; }
执行print(mySelectedEvents)得到:
[Instance of 'GroupBy', Instance of 'GroupBy', Instance of 'GroupBy', Instance of 'GroupBy', Instance of 'GroupBy']
数据库返回的原始数据(print(res)结果):
[{date: 2022-09-17, eventDescp: azerty, eventTitle: azertyui}, {date: 2022-09-17, eventDescp: 11, eventTitle: AZE}, {date: 2022-09-17, eventDescp: 22, eventTitle: 4556}, {date: 2022-09-20, eventDescp: 77, eventTitle: HHJ}, {date: 2022-09-17, eventDescp: 44, eventTitle: BYYY}]
同时出现Instance of 'Future<GroupBy>'的问题,请问如何修改代码生成目标格式的Map?
解决方案
不需要通过GroupBy类转换,直接遍历数据库返回的列表,按日期分组构建目标Map即可:
修改loadPreviousEvents方法如下:
Future<void> loadPreviousEvents() async { final res = await dbRequest(); // 初始化目标Map,明确键为日期字符串,值为事件对象列表 final Map<String, List<Map<String, dynamic>>> mySelectedEvents = {}; for (var rawEvent in res) { // 提取当前事件的日期 final date = rawEvent['date'] as String; // 构建符合要求的事件对象 final eventObj = { 'eventDescp': rawEvent['eventDescp'], 'eventTitle': rawEvent['eventTitle'] }; // 按日期分组:存在则追加事件,不存在则创建新列表 if (mySelectedEvents.containsKey(date)) { mySelectedEvents[date]!.add(eventObj); } else { mySelectedEvents[date] = [eventObj]; } } print(mySelectedEvents); // 将结果赋值给全局变量供后续使用 // this.mySelectedEvents = mySelectedEvents; }
关键说明
- 直接操作数据库返回的原始数据,避免
GroupBy转换带来的实例化问题 - 用
Map<String, List<Map<String, dynamic>>>明确类型,确保结构和目标格式完全匹配 - 遍历过程中完成分组逻辑:通过日期判断是否已存在分组,动态维护事件列表
最终得到的mySelectedEvents就是你需要的日期为键、事件列表为值的Map结构。
内容的提问来源于stack exchange,提问作者Zana Souleymane Coulibaly
相关产品推荐
相关产品推荐

