SynchronousStreamController< T> класс
Контроллер потока, доставляющий события синхронно.
Синхронный контроллер потока предназначен для случаев, когда уже асинхронное событие запускает событие в потоке.
Вместо добавления события в поток в последующей микрозадаче, что приводит к дополнительной задержке, событие немедленно генерируется синхронным контроллером потока, как если бы событие потока было текущим событием или микрозадачей.
Синхронный контроллер потока может использоваться для нарушения соглашения о Stream, и его необходимо использовать осторожно, чтобы этого не произошло.
Единственное преимущество использования SynchronousStreamController по сравнению с обычным StreamController — улучшенная задержка. Используйте синхронную версию только в том случае, если это улучшение существенно и если его использование безопасно. В противном случае просто используйте обычный контроллер потока, который всегда будет иметь правильное поведение для Stream и не нарушит случайно другой код.
Добавление событий в синхронный контроллер должно происходить только в самом конце обработки исходного события. В этот момент добавление события в поток эквивалентно возвращению в цикл обработки событий и добавлению события в следующей микрозадаче.
Каждый обратный вызов слушателя будет выполняться так, как если бы это было событие или микрозадача верхнего уровня. Это означает, что если он выбросит ошибку, об ошибке будет сообщено как об неуловленной как можно скорее. Это одна из причин добавить событие в качестве последнего действия в обработчике исходного события — любые действия, выполненные после добавления события, приведут к задержке сообщения об ошибках в обратных вызовах слушателей событий.
Если событие добавляется в среде, которая не известна как другое событие, это может привести к тому, что слушатель потока получит это событие до того, как слушатель будет готов его обработать. Мы гарантируем, что после вызова Stream.listen вы не получите никаких событий, пока код, выполняющий прослушивание, не завершит работу. Вызов add в ответ на вызов функции неизвестного происхождения может нарушить это обещание.
Обратный вызов onListen от контроллера не является асинхронным событием, и добавление событий в контроллер в onListen обратном вызове всегда неправильно. События будут доставлены до того, как слушатель даже получит подписку.
Синхронный контроллер потока широковещательной передачи также имеет ограничения, которых нет у обычного контроллера потока: методы add, addError, close и addStream не должны вызываться во время доставки события. То есть, если обратный вызов подписки на поток контроллера вызывает любой из вышеперечисленных функций, вызов завершится с ошибкой. Широковещательный поток может иметь более одного слушателя, и если событие добавляется синхронно, в то время как другое также добавляется, последнее событие может достичь некоторых слушателей до первого. Для предотвращения этого событие не может быть добавлено, пока предыдущее событие не будет обработано. Это гарантирует, что событие будет полностью доставлено, когда вернется первый вызов add, addError или close, и дальнейшие события будут доставлены в правильном порядке.
Это по-прежнему гарантирует, что событие будет доставлено подписке. Если подписка приостановлена, фактический обратный вызов может произойти позже, и событие вместо этого будет буферизовано подпиской. Без приостановки, и последующих буферизованных событий, которые еще не были доставлены, обратные вызовы будут вызваны синхронно при добавлении события.
Добавление события в синхронный контроллер потока без широковещательной передачи, пока другое событие находится в процессе обработки, может привести к задержке второго события и его несинхронной доставке, и пока это событие не будет доставлено, контроллер не будет действовать синхронно.
- Реализованные типы
Конструкторы
- SynchronousStreamController()
Свойства
- done → Future только для чтения, унаследованное
- Future, который завершается, когда контроллер потока завершает отправку событий.
- hashCode → int только для чтения, унаследованное
- Код хеширования для этого объекта.
- hasListener → bool только для чтения, унаследованное
- Есть ли подписчик на Stream.
- isClosed → bool только для чтения, унаследованное
- Закрыт ли контроллер потока для добавления дополнительных событий.
- isPaused → bool только для чтения, унаследованное
- Требуется ли буферизация событий подписки.
- onCancel ↔ (FutureOr<
void> Function?()?) чтение/запись, унаследованное - Обратный вызов, который вызывается при отмене потока.
- onListen ↔ (void Function?()?) чтение/запись, унаследованное
- Обратный вызов, который вызывается при прослушивании потока.
- onPause ↔ (void Function?()?) чтение/запись, унаследованное
- Обратный вызов, который вызывается при приостановке потока.
- onResume ↔ (void Function?()?) чтение/запись, унаследованное
- Обратный вызов, который вызывается при возобновлении потока.
- runtimeType → Type только для чтения, унаследованное
- Представление текущего типа объекта во время выполнения.
- sink → StreamSink<
T> только для чтения, унаследованное - Возвращает представление этого объекта, которое экспонирует только интерфейс StreamSink.
- stream → Stream<
T> только для чтения, унаследованное - Поток, которым управляет этот контроллер.
Методы
- add(
T data) → void переопределено - Добавляет событие в поток контроллера.
- addError(
Object error, [StackTrace? stackTrace]) → void переопределено - Добавляет ошибку в поток контроллера.
- addStream(
Stream< T> source, {bool? cancelOnError}) → Future унаследованное - Принимает события от
sourceи помещает их в поток контроллера. - close(
) → Future переопределено - Закрывает поток контроллера.
- noSuchMethod(
Invocation invocation) → dynamic унаследованное - Вызывается при попытке доступа к несуществующему методу или свойству.
- toString(
) → String унаследованное - Строковое представление этого объекта.
Операторы
- operator ==(
Object other) → bool унаследованное - Оператор равенства.
© 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/SynchronousStreamController-class.html