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
相关产品推荐
相关产品推荐

