useStreamSubscription<T> function

void useStreamSubscription<T>(
  1. Stream<T>? stream,
  2. void block(
    1. T
    ), {
  3. void onError(
    1. Object,
    2. StackTrace
    )?,
  4. void onDone()?,
})

Implementation

void useStreamSubscription<T>(
  Stream<T>? stream,
  void Function(T) block, {
  void Function(Object, StackTrace)? onError,
  void Function()? onDone,
}) {
  return useDebugGroup(
    debugLabel: "useStreamSubscription<$T>()",
    debugFillProperties: (properties) => properties.add(ObjectFlagProperty("stream", stream, ifNull: "no stream")),
    () {
      final wrappedBlock = useValueWrapper(block);
      final wrappedOnError = useValueWrapper(onError ?? Zone.current.handleUncaughtError);
      final wrappedOnDone = useValueWrapper(onDone ?? () {});

      useEffect(() {
        final subscription = stream?.listen(
          (it) => wrappedBlock.value(it),
          // ignore: avoid_types_on_closure_parameters
          onError: (Object error, StackTrace stackTrace) => wrappedOnError.value(error, stackTrace),
          onDone: () => wrappedOnDone.value(),
        );
        return () => unawaited(subscription?.cancel());
      }, [stream]);
    },
  );
}