【问题标题】:Query Date from Cloud Firestore and run two separate queries从 Cloud Firestore 查询日期并运行两个单独的查询
【发布时间】:2021-03-04 19:22:34
【问题描述】:

经过 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'

我将以下 sn-p 代码更改为以下代码,它可以工作:

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

【问题讨论】:

  • 我已经设法找到了在这种情况下有效的答案 - 所以我将保留它,并为上面的问题添加更新 - 以防其他人有同样的问题
  • 嗨!感谢您的贡献。我认为将您的解决方案发布为答案并将其标记为正确可能是一个好主意,以便其他人更清楚。提前致谢!
  • 我已经添加了一个答案 - 但似乎没有选项可以将答案标记为正确,或将问题标记为完整?

标签: flutter date dart google-cloud-firestore stream-builder


【解决方案1】:

我已经设法使用 flutter.dev 找到了解决方案 - 标准和最佳实践解决方案似乎是使用 'isAfter' 或 'isBefore' 而不是 '.compareto'

我将以下 sn-p 代码更改为以下代码,它可以工作:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    相关资源
    最近更新 更多