Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗dtSpSmGn 97 of 224 menu
◀ ▶

Поток через 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 и отправьте в поток квадрат индекса. Прочитайте результат и напечатайте все четыре числа.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить