Stream.periodic în Dart

Creează un stream infinit care emite o valoare la fiecare interval de timp, calculată din numărul pasului.

Sintaxă
factory Stream<T>.periodic(Duration period, [T computation(int computationCount)?])

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 for pe Stream.periodic fără take sau break. 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.