我已经在我的 Flutter 应用程序中实现了 DatePicker。我试图限制选择器仅允许用户选择工作日。但是,我不知道该怎么做。我相信这与 SelectableDayPredicate 有关。下面是我的代码片段:
Future<Null> _selectDate(BuildContext context) async {
final DateTime picked = await showDatePicker(
context: context,
initialDate: _date,
firstDate: new DateTime(DateTime.now().year),
lastDate: new DateTime(DateTime.now().year+1),
// to do: I am pretty sure the SelectableDayPredicate should go somewhere here.
);
if (picked != null && picked != _date) {
setState(() {
_date = picked;
});
}
}
当用户点击 listTile 时,将调用 _selectDate 函数。
这是一个我从选择器中省略星期五和星期六的示例,您可以按照此处的逻辑来实现您想要的:
selectableDayPredicate: (DateTime val) =>
val.weekday == 5 || val.weekday == 6 ? false : true,
谢谢!
但是,对于日期选择器,您必须提供一个初始值,它可能应该是 '今天',但如果'今天'是周末,那么你会得到例外!
因此,在这种情况下,我将首字母设置为每月的第一天
initialDate: _dateTime.weekday == 5 || _dateTime.weekday == 6 ? DateTime(DateTime.now().year, DateTime.now().month, 1) : _dateTime ,
selectableDayPredicate: (DateTime val) =>
val.weekday == 5 || val.weekday == 6 ? false : true,
我从不同的答案中得到了参考,并使用以下代码仅处理了工作日的日期选择:
extension DateTimeExtension on DateTime {
DateTime next(int day) {
return this.add(
Duration(days: (day - this.weekday) % DateTime.daysPerWeek,),
);
}
}
此后,设置“initialDate”和“selectableDayPredicate”,如下所示:
initialDate: ((DateTime.now().weekday == DateTime.saturday) || (DateTime.now().weekday == DateTime.sunday)) ? DateTime.now().next(DateTime.monday) : DateTime.now(),
selectableDayPredicate: (DateTime val) => val.weekday == DateTime.saturday || val.weekday == DateTime.sunday ? false : true,
我的参考: