Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗dtSpSmBr 102 of 224 menu
◀ ▶

Широковещательный поток в Dart

Обычный контроллер рассчитан на одного слушателя. Фабрика StreamController.broadcast строит шину событий: отправитель вызывает add, активные подписчики получают значения. Событие до подписки не сохраняется для опоздавшего.

Строку, отправленную до listen, новый слушатель не увидит - только то, что придет после подключения:

import 'dart:async'; void main() async { StreamController<String> bus = StreamController<String>.broadcast(); bus.add('early'); bus.stream.listen((String msg) { print('sub $msg'); }); await Future.delayed(Duration(milliseconds: 20)); bus.add('late'); await Future.delayed(Duration(milliseconds: 20)); bus.close(); }

Подписчик не печатает "early" - событие ушло до старта приема. "late" уже попадает в активную подписку.

Несколько подписчиков на одном объекте получают одни и те же новые элементы:

import 'dart:async'; void main() async { StreamController<int> hub = StreamController<int>.broadcast(); hub.stream.listen((int n) { print('one $n'); }); hub.stream.listen((int n) { print('two $n'); }); await Future.delayed(Duration(milliseconds: 20)); hub.add(7); await Future.delayed(Duration(milliseconds: 20)); hub.close(); }

Число 7 дублируется в двух строках - рассылка общая. Опоздавший слушатель не восстановит пропущенное, пока источник снова не отправит данные.

Широковещательный контроллер принимает строку "ping" до подписки, затем запускается listen и отправляется "pong". В консоли должна быть только вторая строка.

Два listen на одном StreamController.broadcast должны оба напечатать метку "sync" после одной отправки этого текста.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить