tap method

Stream<E> tap({
  1. Callback? onListen,
  2. Callback? onPause,
  3. Callback? onResume,
  4. DataCallback<E>? onData,
  5. ErrorCallback? onError,
  6. Callback? onCancel,
  7. Callback? onDone,
})

Transparently perform side-effects on the events of a Stream, for things such as logging or debugging.

Implementation

Stream<E> tap({
  Callback? onListen,
  Callback? onPause,
  Callback? onResume,
  DataCallback<E>? onData,
  ErrorCallback? onError,
  Callback? onCancel,
  Callback? onDone,
}) {
  final controller =
      isBroadcast ? StreamController<E>.broadcast() : StreamController<E>();
  late StreamSubscription<E> subscription;

  void dispatchOnData(E element) {
    onData?.call(element);
    controller.add(element);
  }

  void dispatchOnError(Object error, [StackTrace? stackTrace]) {
    onError?.call(error, stackTrace);
    controller.addError(error, stackTrace);
    subscription.cancel();
  }

  void dispatchOnDone() {
    onDone?.call();
    controller.close();
    subscription.cancel();
  }

  controller.onListen = () {
    onListen?.call();
    subscription = listen(dispatchOnData,
        onError: dispatchOnError, onDone: dispatchOnDone);
  };
  controller.onPause = () {
    onPause?.call();
    subscription.pause();
  };
  controller.onResume = () {
    onResume?.call();
    subscription.resume();
  };
  controller.onCancel = () async {
    onCancel?.call();
    await subscription.cancel();
  };

  return controller.stream;
}