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

Syncfusion Flutter Calendar日视图首段时间间隔不显示问题求助

解决Syncfusion Flutter Calendar日视图不显示7:00 AM起始时间的问题

问题分析

你设置了startHour:7.0和30分钟时间间隔,但首个时间点7:00 AM未显示,这是因为组件默认可能会根据视图布局自动调整时间标尺的显示起点,导致起始时间被隐藏。同时你需要限制用户只能在7:00-17:00之间创建预约,无法通过降低startHour的方式解决。

解决方案

通过两个步骤解决问题:

  1. 强制指定视图的可见时间范围,确保7:00 AM显示在时间标尺顶部
  2. 拦截预约创建逻辑,限制预约时间在设定范围内

修改后的代码

SfCalendar(
  allowedViews: const [CalendarView.day],
  // 强制设置视图可见的起始和结束时间,确保7:00 AM显示
  firstVisibleTime: const DateTime(2000, 1, 1, 7, 0),
  lastVisibleTime: const DateTime(2000, 1, 1, 17, 0),
  timeSlotViewSettings: const TimeSlotViewSettings(
    startHour: 7.0,
    endHour: 17.0,
    timeInterval: Duration(minutes: 30),
    timeFormat: 'h:mm a',
  ),
  // 拦截预约创建,限制时间范围
  onCreateAppointment: (AppointmentCreationDetails details) {
    final startTime = details.startTime;
    final endTime = details.endTime;
    
    // 校验:起始时间不早于7:00,结束时间不晚于17:00
    if (startTime.hour < 7 || 
        endTime.hour > 17 || 
        (endTime.hour == 17 && endTime.minute > 0)) {
      // 返回null拒绝创建,可根据需求添加用户提示
      return null;
    }
    
    // 正常创建预约
    return Appointment(
      startTime: startTime,
      endTime: endTime,
      subject: details.subject,
    );
  },
)

代码说明

  • firstVisibleTime和lastVisibleTime:固定视图显示的时间范围,组件会读取这两个时间的时分部分来渲染时间标尺,确保7:00 AM作为第一个刻度显示。这里的年月日可以任意设置,不影响效果。
  • onCreateAppointment:通过回调拦截预约创建请求,校验时间是否在允许范围内,不符合则返回null阻止创建,避免用户生成6:30 AM开始的预约。

内容的提问来源于stack exchange,提问作者Vladimir Gadzhov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 12:12:46