Flutter中如何禁止用户在Syncfusion日期范围选择器选中含禁用日期的范围
解决Syncfusion Flutter日期范围选择器禁止选中含禁用日期的范围问题
默认设置disabledDates只会让单个日期变灰不可点,但用户还是能选跨禁用日期的范围,得加自定义拦截逻辑才行。
直接上代码实现:
- 先定义禁用日期列表:
final List<DateTime> _disabledDates = [DateTime(2024, 6, 20)];
- 在
SfDateRangePicker里通过onSelectionChanged回调做范围校验:
SfDateRangePicker( view: DateRangePickerView.month, selectionMode: DateRangePickerSelectionMode.range, disabledDates: _disabledDates, selectedRange: _selectedRange, // 自定义的存储选中范围的变量 onSelectionChanged: (args) { if (args.value is PickerDateRange) { final range = args.value as PickerDateRange; final start = range.startDate; final end = range.endDate; if (start != null && end != null) { // 遍历范围内的所有日期,检查有没有禁用日期 bool hasInvalidDate = false; DateTime current = start; while (current.isBefore(end) || current.isAtSameMomentAs(end)) { if (_disabledDates.any((d) => d.year == current.year && d.month == current.month && d.day == current.day)) { hasInvalidDate = true; break; } current = current.add(const Duration(days: 1)); } if (hasInvalidDate) { // 重置选择+提示用户 setState(() => _selectedRange = null); ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('选的范围里有禁用日期,换一个试试')), ); } else { // 正常保存选择 setState(() => _selectedRange = range); } } } }, )
核心逻辑就是每次选完范围,遍历检查里面有没有禁用日期,有的话就把选择清掉,同时给用户提示。
如果用的是对话框形式的showDateRangePicker,逻辑一样,把校验放在onSubmit回调里就行,不符合条件就不提交。
内容的提问来源于stack exchange,提问作者Virist
相关产品推荐
相关产品推荐

