Широковещательный поток в 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" после
одной отправки этого текста.