Подписка listen в Dart
Иногда удобнее не ждать циклом, а повесить
обработчик на поток. Метод listen
принимает функцию от элемента и возвращает
StreamSubscription для управления
подпиской.
Готовый поток из списка можно вывести так:
import 'dart:async';
void main() {
Stream<int> nums = Stream.fromIterable([1, 2, 3]);
nums.listen((int n) {
print(n);
});
}
Три числа печатаются по мере выдачи. Для одноразового потока одной подписки достаточно, пока программа не завершится.
Перед финальным приемом можно залогировать
элемент, не меняя сами данные - второй
listen на промежуточном шаге не нужен,
достаточно вызова внутри первого обработчика
или цепочки map:
import 'dart:async';
void main() {
Stream<String> tokens = Stream.fromIterable(['alpha', 'beta']);
tokens.listen((String token) {
print('seen $token');
print('got $token');
});
}
Для каждого токена сначала строка "seen ...",
затем "got ...". Порядок задает код
внутри одной лямбды.
Несколько стадий наблюдения удобно строить
операторами перед listen:
import 'dart:async';
void main() {
Stream<int> stream = Stream.fromIterable([2, 3]);
stream
.map((int n) {
print('raw $n');
return n + 1;
})
.listen((int n) {
print('end $n');
});
}
Видны этапы "raw" и "end" для
каждого числа. listen стоит в конце
цепочки и запускает выдачу.
Поток из 1 и 2 перед
listen должен печатать слово
"tick" на каждом элементе внутри
обработчика, затем выводить само число.
Три буквы "p", "q", "r"
подключите через listen с выводом
длины строки, не меняя исходные буквы в
потоке.