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

Flutter SfDateRangePicker自定义周选择:如何切换为周一至周日范围

解决Flutter SfDateRangePicker周选择范围(周一至周日)问题

问题背景

我在实现SfDateRangePicker的周选择功能时,发现组件默认返回的选中范围是周日至周六,但实际业务需要的是周一至周日的周范围。尝试手动给起止日期加一天调整,但代码未生效,原代码如下:

void selectionChanged(DateRangePickerSelectionChangedArgs args) {
    isSameDate(date1, date2) {
        if (date2 == date1) {
          return true;
        }
        if (date1 == null || date2 == null) {
          return false;
        }
        return date1.month == date2.month && date1.year == date2.year && date1.day == date2.day;
    }

    int firstDayOfWeek = DateTime.sunday % 7;
    int endDayOfWeek = (firstDayOfWeek - 1) % 7;
    endDayOfWeek = endDayOfWeek < 0 ? 7 + endDayOfWeek : endDayOfWeek;
    PickerDateRange ranges = args.value;

    DateTime date1 = ranges.startDate!;
    DateTime date2 = (ranges.endDate ?? ranges.startDate)!;

    if (date1.isAfter(date2)) {
      var date = date1;
      date1 = date2;
      date2 = date;
    }
    int day1 = date1.weekday % 7;
    int day2 = date2.weekday % 7;

    DateTime dat1 = date1.add(Duration(days: (firstDayOfWeek - day1) + 1));
    DateTime dat2 = date2.add(Duration(days: (endDayOfWeek - day2) + 1));

    if (!isSameDate(dat1, date1) || !isSameDate(dat2, date2)) {
      datePickerController.selectedRange = PickerDateRange(dat1, dat2);
    }
}

解决方案

方式一:直接配置Picker属性(推荐)

SfDateRangePicker本身支持设置周起始日,只需在组件参数中添加firstDayOfWeek: 1(1代表周一),组件会自动以周一为周起始,选中整周时直接返回周一至周日的范围,无需额外处理回调:

SfDateRangePicker(
  controller: datePickerController,
  selectionMode: DateRangePickerSelectionMode.range,
  firstDayOfWeek: 1, // 将周一设为每周第一天
  // 其他配置属性...
)

方式二:修正selectionChanged回调逻辑

如果必须通过回调手动调整范围,可以简化日期计算逻辑,直接根据选中日期推导所在周的周一和周日:

void selectionChanged(DateRangePickerSelectionChangedArgs args) {
  bool isSameDate(DateTime? date1, DateTime? date2) {
    if (date1 == null || date2 == null) return false;
    return date1.year == date2.year && 
           date1.month == date2.month && 
           date1.day == date2.day;
  }

  PickerDateRange ranges = args.value;
  DateTime selectedDate = ranges.startDate ?? DateTime.now();

  // 计算选中日期所在周的周一
  DateTime startOfWeek = selectedDate.weekday == DateTime.sunday
      ? selectedDate.subtract(const Duration(days: 6))
      : selectedDate.subtract(Duration(days: selectedDate.weekday - 1));
  
  // 计算该周的周日(周一加6天)
  DateTime endOfWeek = startOfWeek.add(const Duration(days: 6));

  PickerDateRange newRange = PickerDateRange(startOfWeek, endOfWeek);
  if (!isSameDate(newRange.startDate, ranges.startDate) || 
      !isSameDate(newRange.endDate, ranges.endDate)) {
    datePickerController.selectedRange = newRange;
  }
}

内容的提问来源于stack exchange,提问作者zero d

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:15:40