Ce face Stream.periodic
Stream.periodic(durata, f) emite f(0) după prima perioadă, f(1) după a doua și așa mai departe. Fără funcție, valorile sunt null. Cronometrul pornește la ascultare.
Stream-ul nu se închide singur. Limitează-l cu take sau takeWhile, sau anulează abonamentul când nu mai ai nevoie de el.
Parametri
| Parametru | Descriere |
|---|---|
period |
Intervalul dintre două valori. |
computation |
Opțional: funcția care primește numărul pasului (de la 0) și dă valoarea. |
Ce returnează
Un Stream<T> infinit.
Exemple
Exemplul 1: Bara de progres
Future<void> main() async {
final progres = Stream.periodic(const Duration(milliseconds: 20), (i) => (i + 1) * 25).take(4);
await for (final p in progres) {
print('${'#' * (p ~/ 25)}${'.' * (4 - p ~/ 25)} $p%');
}
}
Rezultat
#... 25%
##.. 50%
###. 75%
#### 100%
Exemplul 2: Oprire cu takeWhile
Future<void> main() async {
var stoc = 3;
final verificari = Stream.periodic(const Duration(milliseconds: 10), (_) => stoc--).takeWhile((s) => s > 0);
await verificari.forEach((s) => print('Mai sunt în stoc: $s'));
print('Stoc epuizat');
}
Rezultat
Mai sunt în stoc: 3
Mai sunt în stoc: 2
Mai sunt în stoc: 1
Stoc epuizat
Greșeli frecvente
- Folosești
await forpeStream.periodicfărătakesaubreak. Bucla nu se termină niciodată.
Comenzi înrudite
Timer.periodic: Rulează o funcție la fiecare interval de timp, până la cancel; tick numără câte intervale au trecut.Stream.take: take păstrează doar primele n valori și apoi închide stream-ul; skip sare peste primele n valori.Stream.takeWhile: takeWhile emite valori cât timp testul este adevărat și apoi se închide; skipWhile sare peste ele până la primul fals.Future.delayed: Creează un future care se termină după o durată dată, opțional cu valoarea unei funcții; pauza asincronă din Dart.