listenToElementsStream method

StreamSubscription<QuerySnapshot<Object?>> listenToElementsStream({
  1. required String logReference,
  2. required Query<Object?> query,
  3. required ValueSetter<DocumentChange<Object?>> onDocumentChange,
  4. DocumentSnapshot<Object?>? lastDocumentSnapshot,
})

Listening for the stream of QuerySnapshot from Firestore.

logReference is some string for logging purpose. query is query used for this particular call. onDocumentChange is a ValueSetter which will return DocumentChange object from firestore. lastDocumentSnapshot is the snapshot of the last document. If lastDocumentSnapshot is null, it means there will be no pagination.

Implementation

StreamSubscription<QuerySnapshot> listenToElementsStream({
  required String logReference,
  required Query query,
  required ValueSetter<DocumentChange> onDocumentChange,
  DocumentSnapshot? lastDocumentSnapshot,
}) {
  final bool isMoreQuery = lastDocumentSnapshot != null;
  final Query currentQuery = isMoreQuery ? query.startAfterDocument(lastDocumentSnapshot) : query;

  _loggingService.log(
      'FirestoreGenericService.listenToElementsStream.$logReference: Query: ${query.parameters}, IsMoreQuery: $isMoreQuery');

  final StreamSubscription<QuerySnapshot> streamSubscription = currentQuery.snapshots().listen((event) {
    event.docChanges.forEach((docChange) {
      _loggingService.log('FirestoreGenericService.listenToElementsStream.$logReference:'
          ' Type: ${docChange.type}. DocId: ${docChange.doc.id}');
      onDocumentChange(docChange);
    });
  });

  return streamSubscription;
}