如何在Flutter上禁用特定日期列表

时间:2018-12-06 09:10:52

标签: dart flutter flutter-dependencies

我有一个调用showDatePicker的代码,我的问题是如何禁用特定日期,一个,两个或多个json日期的列表? 我尝试在selectableDayPredicate禁用星期六和星期日的情况下,但是如何使用api中的日期的json列表禁用呢?

                onTap: () {
                            showDatePicker(
                              context: context,
                              initialDate:
                                  DateTime.now().add(Duration(days: 2)),
                              firstDate:
                                  DateTime.now().add(Duration(days: 1)),
                              lastDate:
                                  DateTime.now().add(Duration(days: 730)),
                              selectableDayPredicate: (DateTime val) =>
                                  val.weekday == 5 || val.weekday == 6
                                      ? false
                                      : true,
                            );
                          }

1 个答案:

答案 0 :(得分:3)

这很大程度上取决于您从API获得的数据。我无法为您提供帮助,但是我可以为您提供谓词。

假设您已经从服务器中检索了包含一串字符串的json列表,并将其解析为DateTime对象(可能使用类似DateTime.parse的东西),那么它就相对简单了。

基本上,您需要检查每个日期(使用selectableDayPredicate),如果不在列表中,则返回true。

首先,您需要清理DateTime对象,因为它们可能包含小时,秒,毫秒等。并且您需要将它们设置为可以快速搜索的格式-可能不是DateTime。 DateTimes从技术上来说是可行的,因为它们确实具有hashCode实现,但是无论如何,您都必须创建仅包含年,月和日的新DateTime对象(因为从技术上讲,具有+1毫秒的日期时间与没有它的日期时间是不同的值)。如果您确实想这样做,可以更改下面的sanitizeDateTime函数以返回DateTimegetDateSet以返回Set<DateTime>,但是我建议您这样做使它们成为字符串,因为它们在集合中可以很好地工作并且很简单。

因此,您需要一个类似以下的功能:

String sanitizeDateTime(DateTime dateTime) => "${dateTime.year}-${dateTime.month}-${dateTime.day}";

无论您在哪里获取json,都希望使用该json进行格式化并将其插入到集合中。

Set<String> getDateSet(List<DateTime> dates) => dates.map(sanitizeDateTime).toSet();

重要的是您要有一组字符串而不是一个List,因为selectableDayPredicate将运行很多次,并且如果您每次都遍历整个不可选择的日期列表(这就是List的{{1 }}),它可能会变慢,因为它是contains,其中O(n*m)是要检查的日期数,而n是无法选择的日期数-而如果使用集合,{ {1}}使用更有效的哈希计算,然后进行查找,结果为m。这可以解释为过早的优化,但是在这种情况下,我认为这是一个值得的优化。

一旦有了一组不可选择的日期,您只需要在谓词中对它们进行检查即可。

contains