首页 > 解决方案 > 是否有一个订阅流,它不会引发异常。相反,它会自动取消旧订阅?

问题描述

标题几乎描述了一切。我发现自己经常这样做:

  StreamSubscription willDismissPageStreamSubscription;

  @override
  void initState() {
    willDismissPageStreamSubscription?.cancel();
    willDismissPageStreamSubscription =
        bloc.willDismissPageStream(widget.pageIndex).listen((willDismiss) {});
  }

我在可以多次调用的方法中收听流。如果我不取消订阅,它会在每次调用 initState 时创建一个新订阅。我想知道是否有一个允许这样做的流,每次通过调用listen创建一个新的StreamSubscription时,旧的订阅就会被取消:

  @override
  void initState() {
        bloc.willDismissPageStream(widget.pageIndex).listen((willDismiss) {});
  }

编辑:我或多或少地搜索单订阅流,但它应该取消最后一个 StreamSubscription,而不是抛出异常。

编辑 2:如果这样的 Stream 不存在,我将如何创建它?

标签: flutterdartrxjsrx-java2

解决方案


通常,您不希望新订阅改变旧订阅。这使得 observables 难以推理。

这是一个串行模式,通常使用SerialDisposable来实现。原子调用set会取消之前的订阅。

  SerialDisposable serial = new SerialDisposable();

  @override
  void initState() {
       serial.set(bloc.willDismissPageStream(widget.pageIndex).listen((willDismiss) {}));
  }

如果你想在 Observable 中出现这种行为,你可以发送一个完成的通知而不是一个导致管道拆除的错误,但这不是我推荐的。


推荐阅读