onCount method
Reads the count and set a listener to redo the count on changes, including changes made in other browser tabs.
Implementation
Stream<int> onCount(SdbDatabase db, {SdbFindOptions<IK>? options}) {
// ignore: close_sinks
late StreamController<int> controller;
StreamSubscription<List<String>>? externalSub;
void addCount() {
count(db, options: options).then((count) {
if (!controller.isClosed) {
controller.add(count);
}
});
}
FutureOr<void> onChange(
SdbTransaction transaction,
List<SdbRecordChange<K, V>> changes,
) {
addCount();
}
controller = StreamController<int>(
onListen: () {
addCount();
store.addOnChangesListener(db, onChange);
externalSub = db.impl.externalStoreChanges
.where((storeNames) => storeNames.contains(store.name))
.listen((_) => addCount());
controller.onCancel = () {
externalSub?.cancel();
externalSub = null;
store.removeOnChangesListener(db, onChange);
};
},
);
return controller.stream;
}