如何将默认日期设置为今天后的第一周六

时间:2019-08-17 14:46:17

标签: flutter dart

我正在为事件编写应用程序代码,我整天都被禁用,除了Sats以外 它可以正常工作,但是如果dataSicker中的默认值不是Sat或今天是Sat,则如何设置今天之后的第一个Sat的初始日期会遇到问题
还有如何禁用今天甚至是Sats之前的所有日期。 这是我的代码

DateTime _dateTime=DateTime.now();

            showDatePicker(
                context: context,
                initialDate:_dateTime.weekday == 1||_dateTime.weekday == 2||_dateTime.weekday == 3||_dateTime.weekday == 4||_dateTime.weekday == 5  ? DateTime(DateTime.now().year, DateTime.now().month, 1) :  _dateTime,
                firstDate: DateTime(2019),
                lastDate: DateTime(2020),
              selectableDayPredicate: (val)=> val.weekday == 1 ||val.weekday == 2 ||val.weekday == 3 ||val.weekday == 4 || val.weekday == 5 ? false : true,

            );

此代码可以完美运行,但如果今天不是星期六,则默认日期时间为一年的第一天作为默认日期。 您能帮忙解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

从您的问题中得出的结论是,这是您的要求:

操作方法:

  • 除了Sats以外全天禁用

  • 还有如何禁用今天甚至是Sats之前的所有日期

  • 为今天之后的第一个星期六设置初始日期

  • 或今天(如果它是dataPicker中的默认值)

1。如何禁用天数


  bool defineSelectable(DateTime val) {
    DateTime now = DateTime.now();
    // disabled all days before today
    if (val.isBefore(now)) {
      return false;
    }
    // disabled all days except Sats
    switch (val.weekday) {
      case saturday:
        return true;
        break;
      default:
        return false;
    }
  }

  void handleButton(context) async {
    DateTime chosenDate = await showDatePicker(
      ...
      selectableDayPredicate: defineSelectable,
    );
  }

2。如何启动日期


  int daysToAdd(int todayIndex, int targetIndex) {
    if (todayIndex < targetIndex) { // jump to target day in same week
      return targetIndex - todayIndex;
    } else if (todayIndex > targetIndex) { // must jump to next week
      return 7 + targetIndex - todayIndex;
    } else {
      return 0; // date is matched
    }
  }

  DateTime defineInitialDate() {
    DateTime now = DateTime.now();
    int dayOffset = daysToAdd(now.weekday, saturday);
    return now.add(Duration(days: dayOffset));
  }

  void handleButton(context) async {
    DateTime chosenDate = await showDatePicker(
      ...
      initialDate: defineInitialDate(),
      ...
    );
  }

3。完整代码

您可以查看此存储库并在本地构建它TimePickerScreen

4。演示

Demo