Конструктор periodic
Конструктор periodic класса Stream создает поток,
который периодически испускает события через заданный интервал времени.
В первый параметр мы передаем длительность интервала (объект Duration),
через который будут генерироваться события. Второй параметр - это функция,
которая вызывается при каждом событии и возвращает значение, попадающее в поток.
Поток, созданный таким образом, бесконечен. Если функция обратного вызова
вернет null, поток завершится. Также поток можно остановить
с помощью отмены подписки.
Синтаксис
Stream.periodic(Duration duration, [T computation(int computationCount)])
Пример
Давайте создадим поток, который каждую секунду испускает
числа от 0 до 4, а затем завершим его:
import 'dart:async';
void main()
{
Stream<int> stream = Stream.periodic(
Duration(seconds: 1),
(int count) {
if (count >= 5) {
return null;
}
return count;
}
);
stream.listen(
(int value) {
print(value);
},
onDone: () {
print('Stream completed');
}
);
}
Результат выполнения кода:
0
1
2
3
4
"Stream completed"
Пример
Давайте создадим поток, который каждые 500 миллисекунд испускает строку 'abcde', и прослушаем первые три события:
import 'dart:async';
void main()
{
Stream<String> stream = Stream.periodic(
Duration(milliseconds: 500),
(int count) => 'abcde'
);
stream.take(3).listen(
(String value) {
print(value);
}
);
}
Результат выполнения кода:
"abcde"
"abcde"
"abcde"
Пример
Давайте создадим поток, который каждую секунду испускает
числа, умноженные на 2, и остановим его через
3 секунды с помощью отмены подписки:
import 'dart:async';
void main()
{
Stream<int> stream = Stream.periodic(
Duration(seconds: 1),
(int count) => count * 2
);
StreamSubscription<int> subscription = stream.listen(
(int value) {
print(value);
}
);
Future.delayed(Duration(seconds: 3), () {
subscription.cancel();
print('Subscription cancelled');
});
}
Результат выполнения кода:
0
2
4
"Subscription cancelled"