“继续初始化/取消 Firestore 监听器是否会对它的自然行为产生负面影响?”

问题描述 投票:0回答:1

我在以下链接中提出了问题

如果当前更改很大,通过 Firestore 监听更改是否会忽略某些文档并根据最新事件的说明确定优先级?

答案是@Doug Stevenson

您的听众不能保证收到每一个文档 被添加到集合中。您获得的唯一保证 监听器是最新的快照将包含最新的 满足当时查询的文档。如果查询 之后结果发生变化,那么监听者最终会收到一个 查询的新结果集,但不一定是所有结果 自上一个快照以来可能已发生变化。

侦听器不会订阅要查询的一系列精确更改 结果。侦听器订阅了最新的一组文档 一个问题。在良好的网络条件下,您的听众可能会看到所有 改变,但这并不能保证,特别是如果有 网络连接中断(即使是很短的连接),或者 太多的变化难以观察。

答案支持了我所担心的问题,所以我想了一种方法来跟踪事件,让监听者不会错过任何新的细节。

  void cancelMyListner(){
    if(streamSubscription!=null){
      streamSubscription!.cancel();
      streamSubscription = null ;
    }
  }



  StreamSubscription? streamSubscription ;
  void initMyListner(DocumentSnapshot? startAfterValue){
    cancelMyListner();
    CollectionReference myCollection = FirebaseFirestore.instance.collection('payments');

    ///  if it was first call
    final finalStream = startAfterValue==null?
         myCollection
        .orderBy('docDate',descending: true)
        .limit(10)
        .snapshots()
        :
        /// otherwise keep track last updated doc using startAfterDocument
         myCollection
        .orderBy('docDate',descending: false)
        .startAfterDocument(startAfterValue)
        .limit(10)
        .snapshots();

    streamSubscription = finalStream.listen((event) {
      if(event.metadata.isFromCache||event.metadata.hasPendingWrites||event.docs.isEmpty)return;
      
      // some action {....}

      // track last seen doc and init lisner again with passing the value (looping)
      initMyListner(event.docs.first);
    });

  }

根据目前进行的测试,效果很好,但我担心继续重新准备可能会产生负面影响,NO?

flutter google-cloud-firestore
1个回答
0
投票

如果要确保侦听器看到每个文档,则不应在查询上放置

limit
子句。

如果您想跟踪自特定时刻以来发生的变化,您需要:

  1. 确保每个文档都有一个关联的时间点,即通过在其字段中存储时间戳。
  2. 跟踪客户端看到的最后时刻,即在本地存储时间戳值。
  3. 在代码中使用查询仅请求带有客户端看到的最后时刻之后的时间戳的文档。
© www.soinside.com 2019 - 2024. All rights reserved.