captureStates<T> function

Future<List<T>> captureStates<T>({
  1. required ValueListenable<T> listenable,
  2. required Future<void> act(),
  3. bool includeInitial = true,
  4. Duration settle = Duration.zero,
})

Captures all values emitted by a ValueListenable while act runs.

Implementation

Future<List<T>> captureStates<T>({
  required ValueListenable<T> listenable,
  required Future<void> Function() act,
  bool includeInitial = true,
  Duration settle = Duration.zero,
}) async {
  final values = <T>[];
  if (includeInitial) values.add(listenable.value);

  void onState() => values.add(listenable.value);

  listenable.addListener(onState);
  try {
    await act();
    if (settle > Duration.zero) {
      await Future<void>.delayed(settle);
    }
  } finally {
    listenable.removeListener(onState);
  }

  return values;
}