Свойство sink
Свойство sink класса StreamController возвращает объект типа StreamSink, который представляет собой интерфейс для добавления данных в поток. Через этот объект можно отправлять события в поток с помощью метода add, сообщать об ошибках методом addError и закрывать поток методом close. Свойство sink является удобной альтернативой прямым методам контроллера, так как позволяет передавать sink-объект другим частям программы, скрывая сам контроллер.
Синтаксис
StreamController<T> controller = StreamController<T>();
StreamSink<T> sink = controller.sink;
Пример
Давайте создадим контроллер потока и добавим в него несколько чисел через свойство sink:
import 'dart:async';
void main()
{
StreamController<int> controller = StreamController<int>();
controller.stream.listen((value) {
print(value);
});
controller.sink.add(1);
controller.sink.add(2);
controller.sink.add(3);
controller.sink.close();
}
Результат выполнения кода:
1
2
3
Пример
Давайте передадим sink контроллера в отдельную функцию, чтобы добавлять данные в поток извне:
import 'dart:async';
void addData(StreamSink<String> sink)
{
sink.add('abcde');
sink.add('12345');
sink.close();
}
void main()
{
StreamController<String> controller = StreamController<String>();
controller.stream.listen((value) {
print(value);
});
addData(controller.sink);
}
Результат выполнения кода:
"abcde"
"12345"
Пример
Давайте отправим в поток ошибку через метод addError объекта sink:
import 'dart:async';
void main()
{
StreamController<int> controller = StreamController<int>();
controller.stream.listen(
(value) {
print('Value: $value');
},
onError: (error) {
print('Error: $error');
}
);
controller.sink.add(1);
controller.sink.addError('something went wrong');
controller.sink.close();
}
Результат выполнения кода:
Value: 1
Error: something went wrong
Смотрите также
-
класс
StreamController,
который управляет потоком -
свойство
stream,
которое возвращает поток контроллера -
метод
add,
который добавляет данные в поток -
метод
close,
который закрывает поток