如何使用 SelectableDayPredicate 将 DatePicker 限制为仅工作日?

问题描述 投票:0回答:3

我已经在我的 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 函数。

datetime dart flutter datetimepicker
3个回答
22
投票

这是一个我从选择器中省略星期五和星期六的示例,您可以按照此处的逻辑来实现您想要的:

selectableDayPredicate: (DateTime val) =>
            val.weekday == 5 || val.weekday == 6 ? false : true,

4
投票

谢谢!

但是,对于日期选择器,您必须提供一个初始值,它可能应该是 '今天',但如果'今天'是周末,那么你会得到例外!

因此,在这种情况下,我将首字母设置为每月的第一天

    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,

0
投票

我从不同的答案中得到了参考,并使用以下代码仅处理了工作日的日期选择:

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,

我的参考:

  1. 根据@Moti_Bartov
  2. 根据@davideliseo
© www.soinside.com 2019 - 2024. All rights reserved.