在 Dart / Flutter 的 Firestore 查询中添加限制时,不会调用 Stream Listen

Posted

技术标签:

【中文标题】在 Dart / Flutter 的 Firestore 查询中添加限制时,不会调用 Stream Listen【英文标题】:Stream listen is not called when limit is added in Firestore query in Dart / Flutter 【发布时间】:2021-09-04 05:38:07 【问题描述】:

在 Dart / Flutter 中的 Firestore 查询中添加限制时不会调用 Stream listen

final _startAtTimestamp = Timestamp.fromMillisecondsSinceEpoch(DateTime.parse('2000-01-01 01:01:01.001').millisecondsSinceEpoch);

我在initState() 函数中使用了以下代码:

@override
void initState() 
    //
    super.initState();

    Future.delayed(Duration(seconds: 1), () async 
      // 
      Stream<QuerySnapshot> xstream = FirebaseFirestore.instance
          .collection('messages')
          .where('encSenderUId', isEqualTo: _loggedInUserId)
          .where('encReceiverUId', isEqualTo: widget.encUId)
          .orderBy('messageId', descending: true)
          .startAt([_startAtTimestamp])
          .limit(1)
          .snapshots();

      xstream.listen((event) 
        //
        print('Hiii, I am listening..');

        //
      , onDone: () 
        print("Task Done single");
      , onError: (error) 
        print("Some Error $error.toString()");
      );

    );


案例 1:如果我在查询中使用 limit(),那么在第一次渲染屏幕时会打印一次 listen 消息,并且在 Firestore 中发生更改时也会调用 listen流(例如,添加新文档/删除文档)。

案例 2:如果我在查询中使用 limit(),则在第一次呈现屏幕时会打印一次 listen 消息,但在 Firestore 流中发生更改时会调用 listen(例如,添加新文档/删除文档)。

我必须使用limit() 根据集合orderBy 获取一个文档。我 100% 确定 limit() 不允许流监听任何事件。

Firestore 结构如下:

请建议我如何使用 limit 和 `listen' 来解决这个问题。非常感谢。

【问题讨论】:

尝试在listen方法中添加onError @pskink 谢谢亲爱的,我已经添加了onDoneonError 回调方法和listen 但是系统不会进入这3 个listenonDoneonError 方法中的任何一个。我通过在末尾添加onDoneonError 更新了问题。请检查并建议我。谢谢。 Firestore 数据库结构为awesomescreenshot.com/image/… 请在问题中包含您的 Firestore 结构作为屏幕截图。链接可能会中断和移动,这将使未来的读者无法使用。 谢谢@Jay 我已经在查询中添加了Firestore Structure 的屏幕截图。顺便说一句,您对此问题有任何解决方案吗?请分享。谢谢。 【参考方案1】:

首先处理您的查询(包括.limit(1)),然后附加侦听器-因此您正在侦听对一个且仅一个文档的更改。只有对该文档的更改才会导致更新。它不会重新处理查询。您是否正在尝试收听最新的文档?

【讨论】:

1) 如果我没有在查询中添加.limit(1),那么它会返回19 个documents,这是正确的,但我的要求是从这19 个documents 中只得到一个document messagescollection. 2) 你说得对,快照在一个“文档”或 19 个documents 案例中都只有 1 个QuerySnapshotObject。我们将不得不进一步处理 QuerySnapshotObject 以获得一个 / 19 documents,我们可以在 QuerySnapshotObject 上使用 map。它有效,但添加 .limit(1) 没有返回任何内容。任何建议将不胜感激?谢谢。 你误会了。当您将 .limit(1) 添加到查询中时,QuerySnapshotObject 将 包含 ONE 对象,并且仅对该 ONE 对象的更改将触发更新。更改 ANY 其他文档,或 ADDING 任何文档,不会触发更新 - 只是因为当新文档出现时查询会导致不同的文档添加并不意味着监听器将被更新。查询选择要收听的文档,并将仅收听那些文档 - 查询不会重新运行。 .onSnapshot() 监听所选文档,NOT 监听查询。

以上是关于在 Dart / Flutter 的 Firestore 查询中添加限制时,不会调用 Stream Listen的主要内容,如果未能解决你的问题,请参考以下文章

Flutter学习笔记·初识Dart语言

Flutter开发 Flutter 包和插件 ( 开发 Dart 插件包 | 发布 Dart 插件包 )

Android Gradle 问题 - Flutter / Dart

在 Flutter 中意外删除了 dart 包

flutter - 如何在 dart/flutter 中收听流值

Flutter为什么使用Dart?