Flutter/Dart Отключите несколько дней недели с помощью enabledDayПредиката API календаря / пакета TableCalendar

#arrays #flutter #dart #maps

Вопрос:

В этот момент я кручу свои колеса, но никуда не иду, и мне бы не помешала помощь. У меня есть массив/список дней недели, которые я хочу отключить в своем календаре с помощью функции enabledPredicateDay. например [«воскресенье», «понедельник», «вторник»].

 return TableCalendar(  calendarBuilders: CalendarBuilders(dowBuilder: (context, day) {  if (day.weekday == DateTime.sunday) {  final text = DateFormat.E().format(day);  return Center(  child: Text(  text,  style: TextStyle(color: Colors.red),  ),  );  }  }),  firstDay: kFirstDay,  lastDay: kLastDay,  focusedDay: _focusedDay,  calendarFormat: _calendarFormat,  enabledDayPredicate: (date) {  // this is where we disable any days that the user is not available OR is booked up   var disabledDays = "";  unavailableDays.asMap().forEach((index, value) {  if (index == 0) {  disabledDays = disabledDays   "date.weekday != DateTime.$value";  } else {  disabledDays = disabledDays   " amp;amp; date.weekday != DateTime.$value";  }  });    date.weekday != disabledDays; // here I'm trying to get some sort of boolean back.   return date.weekday != disabledDays;   }  

Проблема, с которой я сталкиваюсь, заключается в том, что я могу либо вернуть только один день программно, скажем, в цикле «для в», либо мне нужно жестко его закодировать. Это связано с тем, что возвращаемое значение должно быть логическим.

Я попытался объединить все в строку, а затем преобразовать ее в метод, чтобы каждый день, когда мне нужно отключить, можно было использовать оператор return следующим образом:

 return date.weekday != DateTime.$value amp;amp; date.weekday != DateTime.$value amp;amp; date.weekday != DateTime.$value  

Все работает нормально, если я закодирую это так:

 return date.weekday != DateTime.sunday amp;amp; date.weekday != DateTime.monday amp;amp; date.weekday != DateTime.tuesday  

Но я не смог добраться до этого момента, потому что я получаю строку обратно, но мне нужен bool.

Как вернуть несколько дней для этой конкретной функции?

Ответ №1:

Я понял это…кажется очень банальным, и, возможно, это можно улучшить. То, что я сделал здесь, было экземпляром переменной для каждого дня. А затем, когда я просматриваю дни недели, чтобы проверить, какой из них недоступен с помощью условных операторов, я назначаю день недели переменной тогда и только тогда, когда он недоступен.

 var unavailableDay1; var unavailableDay2; var unavailableDay3; var unavailableDay4; var unavailableDay5; var unavailableDay6; var unavailableDay7;  for (var day in daysOfWeek) {  // print(widget.data[day]);  if (widget.data[day] == null) {  unavailableDays.add(day);  } } for (var day in unavailableDays) {  if (day == "monday") {  unavailableDay1 = 1;  } else if (day == "tuesday") {  unavailableDay2 = 2;  } else if (day == "wednesday") {  unavailableDay3 = 3;  } else if (day == "thursday") {  unavailableDay4 = 4;  } else if (day == "friday") {  unavailableDay5 = 5;  } else if (day == "saturday") {  unavailableDay6 = 6;  } else if (day == "sunday") {  unavailableDay7 = 7;  } }  

Наконец, я проверяю, имеет ли значение каждый из 7 дней, если не возвращается значение null. Таким образом, он возвращает мне только те дни, которые включены! Я надеюсь, что это кому-то поможет! Пожалуйста, помогите мне улучшить это!

 enabledDayPredicate: (date) {  // this is where we disable any days that the user is not available OR is booked up  return date.weekday != unavailableDay1 amp;amp;  date.weekday != unavailableDay2 amp;amp;  date.weekday != unavailableDay3 amp;amp;  date.weekday != unavailableDay4 amp;amp;  date.weekday != unavailableDay5 amp;amp;  date.weekday != unavailableDay6 amp;amp;  date.weekday != unavailableDay7;  },