我在以下链接中提出了问题
如果当前更改很大,通过 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?
如果要确保侦听器看到每个文档,则不应在查询上放置
limit
子句。
如果您想跟踪自特定时刻以来发生的变化,您需要: