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

如何使用calendar_view包在MonthView组件中添加/显示事件

解决calendar_view中MonthView显示事件的问题

你当前代码的核心问题有两个:一是重复创建了EventController实例,导致事件数据无法共享;二是没有在cellBuilder中正确利用传入的事件参数来渲染内容。以下是修正后的实现步骤和代码:

关键修正点

  • 共用同一个EventController:在CalendarControllerProvider和MonthView中必须使用同一个EventController实例,否则事件数据无法传递到视图中。
  • 将事件添加到控制器:创建好事件列表后,要通过controller.addEvents()方法把事件注入到控制器里。
  • 利用cellBuilder的events参数:cellBuilder的第二个参数就是当前日期对应的事件集合,直接遍历这个集合就能渲染事件内容。

完整修正代码

// 初始化EventController并添加事件
final EventController eventController = EventController();

List<CalendarEventData> events = [
  CalendarEventData(
    title: "项目同步会",
    date: DateTime(2023, 06, 2),
    event: "Q2进度评审",
  ),
  CalendarEventData(
    title: "生日聚餐",
    date: DateTime(2023, 06, 2),
    event: "好友生日庆祝",
  ),
];

@override
void initState() {
  super.initState();
  // 将事件添加到控制器
  eventController.addEvents(events);
}

@override
void dispose() {
  eventController.dispose();
  super.dispose();
}

// 构建视图
@override
Widget build(BuildContext context) {
  return CalendarControllerProvider(
    controller: eventController, // 使用同一个控制器实例
    child: MaterialApp(
      home: Scaffold(
        body: MonthView(
          controller: eventController, // 这里也要用同一个实例
          cellBuilder: (date, events, isToday, isInMonth) {
            return Column(
              mainAxisSize: MainAxisSize.min,
              children: [
                Text(date.day.toString()),
                // 遍历当前日期的事件列表,显示事件标题
                ...events.map((event) => Text(
                      event.title,
                      style: TextStyle(fontSize: 10),
                    )),
              ],
            );
          },
          minMonth: DateTime(2020),
          maxMonth: DateTime(2023),
          initialMonth: DateTime(DateTime.now().year, DateTime.now().month),
          onPageChange: (date, pageIndex) => print("$date, $pageIndex"),
          onCellTap: (events, date) {
            // 点击单元格时可处理事件,比如弹窗显示详情
            print("日期: $date 的事件: $events");
          },
          startDay: WeekDays.sunday,
        ),
      ),
    ),
  );
}

代码说明

  1. 在initState中把事件添加到EventController,确保视图初始化时就能获取到事件数据。
  2. cellBuilder里的events参数已经是过滤好的当前日期的事件,直接用map遍历生成对应的Text组件即可,多个事件会自动垂直排列。
  3. 记得在dispose中销毁控制器,避免内存泄漏。

内容的提问来源于stack exchange,提问作者milano zz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 02:45:27