Поток через async* и yield в Dart
Новый поток собирают функцией с модификатором
async* и типом возврата Stream<T>.
Внутри доступен yield, отправляющий
очередное значение слушателю.
Одна функция может отдать сколько угодно элементов -
каждый yield приостанавливает генератор,
пока текущее значение не обработано:
import 'dart:async';
Stream<String> sizes() async* {
yield 'S';
yield 'M';
yield 'L';
}
void main() async {
await for (String tag in sizes()) {
print(tag);
}
}
Три метки печатаются подряд без пропусков: порядок
yield сохраняется в одном проходе чтения.
Между отправками допустимы обычные вычисления и ветвления - в поток уходят уже готовые результаты:
import 'dart:async';
class Post {
String title;
Post(this.title);
}
Stream<int> countdown(int n) async* {
while (n > 0) {
yield n;
n = n - 1;
}
}
void main() async {
Post note = Post('draft');
print(note.title);
await for (int value in countdown(3)) {
print(value);
}
}
Числа 3, 2 и 1
отражают цикл внутри генератора. Так одна
async*-функция описывает и правило, и
всю последовательность на выходе.
Опишите поток из трех строк "red",
"green" и "blue" через
отдельные yield. Прочитайте его в
await for и выведите каждую строку
с новой строки.
Внутри async* пройдите по числам от
1 до 4 и отправьте в поток
квадрат индекса. Прочитайте результат и
напечатайте все четыре числа.