onSnapshots method
Reads the data and set a listener to redo the query on changes, including changes made in other browser tabs.
Implementation
Stream<List<SdbRecordSnapshot<K, V>>> onSnapshots(
SdbDatabase db, {
SdbFindOptions<K>? options,
}) {
// ignore: close_sinks
late StreamController<List<SdbRecordSnapshot<K, V>>> controller;
StreamSubscription<List<String>>? externalSub;
void addSnapshots() {
_addQueryResult(controller, findRecords(db, options: options));
}
FutureOr<void> onChange(
SdbTransaction transaction,
List<SdbRecordChange<K, V>> changes,
) {
addSnapshots();
}
controller = StreamController<List<SdbRecordSnapshot<K, V>>>(
onListen: () {
addSnapshots();
addOnChangesListener(db, onChange);
externalSub = db.dbInterface.externalStoreChanges
.where((storeNames) => storeNames.contains(name))
.listen((_) => addSnapshots());
controller.onCancel = () {
externalSub?.cancel();
externalSub = null;
removeOnChangesListener(db, onChange);
};
},
);
return controller.stream;
}