onSnapshots method

Stream<List<SdbRecordSnapshot<K, V>>> onSnapshots(
  1. SdbDatabase db, {
  2. SdbFindOptions<K>? options,
})

Reads the data and set a listener to redo the query on changes. It only tracks changes in the current isolate/tab.

Implementation

Stream<List<SdbRecordSnapshot<K, V>>> onSnapshots(
  SdbDatabase db, {
  SdbFindOptions<K>? options,
}) {
  late StreamController<List<SdbRecordSnapshot<K, V>>> controller;
  void addSnapshots() {
    findRecords(db, options: options).then((snapshots) {
      if (!controller.isClosed) {
        controller.add(snapshots);
      }
    });
  }

  FutureOr<void> onChange(
    SdbTransaction transaction,
    List<SdbRecordChange<K, V>> changes,
  ) {
    addSnapshots();
  }

  controller = StreamController<List<SdbRecordSnapshot<K, V>>>(
    onListen: () {
      addSnapshots();
      addOnChangesListener(db, onChange);
      controller.onCancel = () {
        removeOnChangesListener(db, onChange);
      };
    },
  );
  return controller.stream;
}