Класс StreamController
Класс StreamController создает поток, которым можно
управлять вручную. Он предоставляет методы для добавления
данных в поток, добавления ошибок и закрытия потока.
Конструктор класса принимает необязательный параметр
onListen - функцию, которая вызывается при появлении
первого слушателя, необязательный параметр onCancel -
функцию, которая вызывается при отмене подписки, и
необязательный параметр sync - флаг, определяющий
синхронную или асинхронную доставку событий. Свойство
stream возвращает поток, к которому можно подключиться
через метод listen.
Синтаксис
StreamController<T> controller = StreamController<T>();
controller.stream
controller.sink
controller.add(value)
controller.addError(error)
controller.close()
Пример
Давайте создадим контроллер потока, добавим в него несколько значений и закроем поток:
import 'dart:async';
void main()
{
StreamController<int> controller = StreamController<int>();
controller.stream.listen(
(int value) => print(value),
onDone: () => print('done')
);
controller.add(1);
controller.add(2);
controller.add(3);
controller.close();
}
Результат выполнения кода:
1
2
3
"done"
Пример
Давайте добавим в поток ошибку и обработаем ее
через параметр onError:
import 'dart:async';
void main()
{
StreamController<int> controller = StreamController<int>();
controller.stream.listen(
(int value) => print(value),
onError: (Object error) => print('error: $error'),
onDone: () => print('done')
);
controller.add(1);
controller.addError('oops');
controller.add(2);
controller.close();
}
Результат выполнения кода:
1
"error: oops"
2
"done"
Пример
Давайте создадим контроллер с параметром onListen,
который выведет сообщение при подключении первого слушателя:
import 'dart:async';
void main()
{
StreamController<String> controller = StreamController<String>(
onListen: () => print('listener attached')
);
controller.stream.listen((String value) => print(value));
controller.add('abcde');
controller.close();
}
Результат выполнения кода:
"listener attached"
"abcde"