I want to create a pagination screen, using Bloc, from the Firestore database. The screen should update on document changes.
My FirestoreProviderApi
receives fetch requests from the Bloc unit. After fetching the documents from Firestore, it sends them back to the Bloc using a Stream
.
The FirestoreProviderApi
:
final _pollOverviewStreamController = BehaviorSubject<QuerySnapshot>();
@override
Stream<QuerySnapshot> getOverviewPolls<QuerySnapshot>() =>
_pollOverviewStreamController.asBroadcastStream().cast();
@override
Future<void> fetchFirstOverviewPolls() async {
_overviewPollsRef.limit(5).snapshots().listen((querySnapshot) {
_pollOverviewStreamController.add(querySnapshot);
});
}
@override
Future<void> fetchNextOverviewPolls() async {
if (_pollOverviewStreamController.value.docs.isEmpty) return;
final lastDoc = _pollOverviewStreamController.value.docs.last;
_overviewPollsRef
.startAfterDocument(lastDoc)
.limit(5)
.snapshots()
.listen((querySnapshot) {
_pollOverviewStreamController.add(querySnapshot);
});
}
On document changes, I want to update my list of documents.
Right now, whenever a change occurs, a new QuerySnapshot is appended to the Stream (instead of replacing the old one). Is there a way to combine multiple listeners to the same Stream, aggregating only the most up-to-date data?