【问题标题】:Stream listen is not called when limit is added in Firestore query in Dart / Flutter在 Dart / Flutter 的 Firestore 查询中添加限制时,不会调用 Stream Listen
【发布时间】: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 的屏幕截图。顺便说一句,您对此问题有任何解决方案吗?请分享。谢谢。

标签: flutter dart google-cloud-firestore stream listen


【解决方案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 监听查询。
猜你喜欢
  • 1970-01-01
  • 2019-01-04
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
相关资源
最近更新 更多