Дата запроса из Cloud Firestore и запуск двух отдельных запросов

После 2 дней непрерывных исследований, тестирования и попыток - я обращаюсь за столь необходимой помощью!

Я запрашиваю коллекцию Firestore и возвращаю записи, соответствующие запросу (всегда будет только ноль или один результат), где поле UserId соответствует зарегистрированному uid. Это прекрасно работает. Следующим шагом является проверка поля ввода даты, которое является меткой времени в коллекции, в этом отчете и сравнение его с датой и временем на данный момент.

Затем мне нужно перейти на один уровень дальше и выполнить второй запрос, по сути:

  • если есть совпадение записи И поле даты равно => сейчас, то отобразить x;
  • если есть совпадение записи И поле даты имеет значение ›= сейчас, то отобразить y;
  • или же, если совпадений записи нет, то вывести z;

Я не могу понять, что это за сообщение об ошибке, и как лучше всего проверить дату после запроса, чтобы увидеть, находится ли она в прошлом (и отображать x) или в будущем (и отображать y)?

Следующий код не вызывает ошибок в Android Studio, и приложение может работать, но сообщение об ошибке в консоли:

Class 'DateTime' has no instance method 'Timestamp'.
Receiver: Instance of 'DateTime'
Tried calling: compareto(Instance of 'DateTime')

Код:

StreamBuilder(
  stream: FirebaseFirestore.instance
      .collection('collectionDatabase')
      .where('uid', isEqualTo: _auth.currentUser.uid)
      .snapshots(),
          builder: (context, snapshot) {
             List<Widget> statusExample = [];
                if (snapshot.hasData) {
                  final cover = snapshot.data.docs;
                  for (var coverIn in cover) {
                    final singleDate = coverIn.data()['endDate'].toDate();
                    final endDate = coverIn.data()['endDate']
                    .toDate()
                    .toString()
                    .substring(0, 10);
                       var dateNow = DateTime.now();
                       final getEndDate = Text('$endDate');
                       final expiredEndDate = Text('No!');
                          if (singleDate.compareto(dateNow) > 0) { // this line of code is incorrect - the corrected version of this line is below....
                             var statusExample = getEndDate;
                             return StatusDateNow;
                          } else {
                             var statusExample = expiredDate;
                             return StatusDateNow;
                          }
                                   
                     }
               }
                       return Column(children: StatusDateNow);
          }),

ОБНОВЛЕНИЕ

Мне удалось найти решение с помощью flutter.dev — стандартное и передовое решение, по-видимому, заключается в использовании «isAfter» или «isBefore» вместо «.compareto».

Я изменил следующий фрагмент кода на следующий, и он работает:

if (singleDate.isAfter(dateNow) == true)  { 

person cc976a    schedule 21.11.2020    source источник
comment
Мне удалось найти ответ, который сработал в этом сценарии, поэтому я оставлю это и добавлю обновление к вопросу выше - на случай, если у кого-то еще возникнет такая же проблема.   -  person cc976a    schedule 21.11.2020
comment
Привет! Спасибо за ваш вклад. Я думаю, что было бы неплохо опубликовать свое решение в качестве ответа, и вы отметите его как правильное, чтобы это было более понятно для других. Заранее спасибо!   -  person Samuel Romero    schedule 24.11.2020
comment
Я добавил ответ, но, похоже, у меня нет возможности отметить ответ как правильный или вопрос как завершенный?   -  person cc976a    schedule 24.11.2020


Ответы (1)


Мне удалось найти решение с помощью flutter.dev — стандартное и передовое решение, по-видимому, заключается в использовании «isAfter» или «isBefore» вместо «.compareto».

Я изменил следующий фрагмент кода на следующий, и он работает:

if (singleDate.isAfter(dateNow) == true)  { 
person cc976a    schedule 24.11.2020