Конструктор StreamController< T>.broadcast
- {void onListen( )?,
- void onCancel( )?,
- bool sync = false}
Контроллер, у которого поток можно прослушивать более одного раза.
Поток, возвращаемый потоком, является широковещательным. Его можно прослушивать более одного раза.
Поток должен оставаться неактивным, пока подписчик не начнёт его прослушивать (используя обратный вызов onListen для начала создания событий). Потоки не должны расходовать ресурсы (например, веб-сокеты), если никто никогда не начинает их прослушивать.
Широковещательные потоки не буферизуют события, если у них нет слушателей.
Контроллер распределяет все события между всеми текущими подписчиками в момент вызова add, addError или close. Нельзя вызывать add, addError или close до завершения предыдущего вызова. У контроллера нет внутренней очереди событий. Если в момент добавления события нет слушателей, оно будет просто отброшено, а если это ошибка — она будет сообщена как необработанная.
Каждая подписка слушателя обрабатывается независимо. Если она приостанавливается, это затрагивает только приостановившегося слушателя. Приостановленный слушатель буферизует события внутри себя до возобновления или отмены подписки.
Если sync равно true, события могут отправляться непосредственно подпискам потока во время вызова add, addError или close. Возвращаемый контроллер потока является SynchronousStreamController и требует осторожного использования, чтобы не нарушить контракт Stream. Объяснения о том, когда можно использовать синхронную отправку, см. в разделе Completer.sync. Если вы не уверены, используйте несинхронный контроллер.
Если sync равно false, событие всегда будет отправлено позже, после завершения кода, добавляющего это событие. В этом случае не гарантируется, когда именно несколько слушателей получат события, за исключением того, что каждый слушатель получит все события в правильном порядке. Каждая подписка обрабатывает события независимо. Если на асинхронный контроллер с двумя слушателями отправлены два события, один из слушателей может получить оба события до того, как другой получит какое-либо из них. Чтобы получить событие, слушатель должен быть подписан как в момент его возникновения (то есть при вызове add), так и в момент его последующей отправки.
Обратный вызов onListen вызывается при подписке первого слушателя, а onCancel — когда активных слушателей больше не остаётся. Если позже снова добавить слушателя, после вызова onCancel, обратный вызов onListen будет вызван повторно.
Реализация
factory StreamController.broadcast(
{void onListen()?, void onCancel()?, bool sync = false}) {
return sync
? _SyncBroadcastStreamController<T>(onListen, onCancel)
: _AsyncBroadcastStreamController<T>(onListen, onCancel);
}
© 2012 the Dart project authors
Licensed under the BSD 3-Clause "New" or "Revised" License.
https://api.dart.dev/stable/2.19.6/dart-async/StreamController/StreamController.broadcast.html