useStreamEffect<T> function

AsyncSnapshot<T?> useStreamEffect<T>(
  1. Stream<T> block(),
  2. List<Object?> keys
)

Implementation

AsyncSnapshot<T?> useStreamEffect<T>(
  Stream<T> Function() block,
  List<Object?> keys,
) {
  final ret = useState(AsyncSnapshot<T?>.waiting());

  useEffect(
    () {
      StreamSubscription<T> sub;

      try {
        sub = block().listen(
          (x) => ret.value = AsyncSnapshot.withData(ConnectionState.active, x),
          onError: (Object e) =>
              ret.value = AsyncSnapshot.withError(ConnectionState.active, e),
          onDone: () => ret.value =
              const AsyncSnapshot.withData(ConnectionState.done, null),
        );
      } catch (e) {
        ret.value = AsyncSnapshot.withError(ConnectionState.active, e);
        rethrow;
      }

      return sub.cancel;
    },
    [block, ...keys],
  );

  return ret.value;
}