Spec-Zone.ru › Dart 2

dart:async

Поток<T>.multi конструктор

  1. @Since("2.9")
Поток<T>.multi(
  1. void onListen(
    1. MultiStreamController<T>
    ),
  2. {bool isBroadcast = false}
)

Создает поток с множественным подписом.

Каждый раз, когда к созданному потоку подключается слушатель, вызывается обратный вызов onListen, получая новый MultiStreamController, который перенаправляет события на StreamSubscription, возвращаемый этим вызовом listen.

Это позволяет рассматривать каждого слушателя как отдельный поток.

MultiStreamController не поддерживает чтение своего StreamController.stream. Установка его StreamController.onListen не оказывает никакого влияния, так как вместо этого вызывается обратный вызов onListen, и StreamController.onListen не будет вызван позднее. Контроллер действует как асинхронный контроллер, но предоставляет дополнительные методы для синхронной передачи событий.

Если isBroadcast установлено в значение true, Stream.isBroadcast возвращаемого потока будет true. Это не влияет на поведение потока; функция onListen должна сама реализовывать поведение широковещательного потока, если она заявляет о таком поведении.

Поток с множественным подписом может вести себя как любой другой поток. Если обратный вызов onListen генерирует исключение при каждом вызове после первого, поток ведет себя как поток с одиночной подпиской. Если поток отправляет одни и те же события всем текущим слушателям, он ведет себя как широковещательный поток.

Он также может выбрать отправку различных событий различным слушателям. Например, поток, который повторяет последнее не-null событие новым слушателям, может быть реализован так, как показано в примере:

extension StreamRepeatLatestExtension<T extends Object> on Stream<T> {
  Stream<T> repeatLatest() {
    var done = false;
    T? latest = null;
    var currentListeners = <MultiStreamController<T>>{};
    this.listen((event) {
      latest = event;
      for (var listener in [...currentListeners]) listener.addSync(event);
    }, onError: (Object error, StackTrace stack) {
      for (var listener in [...currentListeners]) listener.addErrorSync(error, stack);
    }, onDone: () {
      done = true;
      latest = null;
      for (var listener in currentListeners) listener.closeSync();
      currentListeners.clear();
    });
    return Stream.multi((controller) {
      if (done) {
        controller.close();
        return;
      }
      currentListeners.add(controller);
      var latestValue = latest;
      if (latestValue != null) controller.add(latestValue);
      controller.onCancel = () {
        currentListeners.remove(controller);
      };
    });
  }
}

Реализация

@Since("2.9")
factory Stream.multi(void Function(MultiStreamController<T>) onListen,
    {bool isBroadcast = false}) {
  return _MultiStream<T>(onListen, isBroadcast);
}

© 2012 the Dart project authors
Licensed under the BSD 3-Clause "New" or "Revised" License.
https://api.dart.dev/stable/2.18.5/dart-async/Stream/Stream.multi.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API