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

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;
}

关键说明

  1. 直接操作数据库返回的原始数据,避免GroupBy转换带来的实例化问题
  2. 用Map<String, List<Map<String, dynamic>>>明确类型,确保结构和目标格式完全匹配
  3. 遍历过程中完成分组逻辑:通过日期判断是否已存在分组,动态维护事件列表

最终得到的mySelectedEvents就是你需要的日期为键、事件列表为值的Map结构。


内容的提问来源于stack exchange,提问作者Zana Souleymane Coulibaly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:10:33