Есть ли единый поток подписки, не вызывающий исключения. Вместо этого он автоматически отменяет старую подписку? - PullRequest
0 голосов
/ 06 мая 2020

Название в значительной степени описывает все. Я часто делаю это:

  StreamSubscription willDismissPageStreamSubscription;

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

Я слушаю поток в методе, который можно вызывать несколько раз. Если бы я не отменял подписку, она создавала бы новую каждый раз, когда я вызываю initState. Мне интересно, есть ли Stream, который позволяет это, каждый раз, когда создается новая StreamSubscription через вызов listen, старая подписка отменяется:

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

EDIT: я ищу более или менее Single- Subscription-Stream, но вместо того, чтобы генерировать исключение, он должен отменить последнюю StreamSubscription.

РЕДАКТИРОВАТЬ 2: Если такой поток не существует, как мне его создать?

1 Ответ

1 голос
/ 07 мая 2020

Как правило, вы не хотите, чтобы новые подписки изменяли старые подписки. Это затрудняет рассуждение о наблюдаемых.

Это последовательный шаблон, который обычно реализуется с использованием SerialDisposable . Вызов set атомарно отменяет предыдущую подписку.

  SerialDisposable serial = new SerialDisposable();

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

Если вам нужно такое поведение в Observable, вы можете отправить завершенное уведомление вместо ошибки, которая вызывает разрыв конвейера, но это не то, что я ' d рекомендую.

...