Ce face Stream.forEach
forEach este o formă scurtă pentru o buclă await for care doar face ceva cu fiecare valoare. Future-ul returnat se termină când stream-ul se închide, sau cu eroare la prima eroare din stream.
Dacă acțiunea returnează un Future, acesta nu este așteptat. Pentru pași asincroni pe rând folosește await for sau asyncMap.
Parametri
| Parametru | Descriere |
|---|---|
action |
Funcția chemată cu fiecare valoare. |
Ce returnează
Un Future<void>.
Exemple
Exemplul 1: Afișarea fiecărei notificări
Stream<String> notificari() async* {
for (final n in ['Comanda a fost preluată', 'Curierul este pe drum', 'Comanda a fost livrată']) {
await Future.delayed(const Duration(milliseconds: 10));
yield n;
}
}
Future<void> main() async {
await notificari().forEach((n) => print('🔔 $n'));
print('Nu mai sunt notificări.');
}
Rezultat
🔔 Comanda a fost preluată
🔔 Curierul este pe drum
🔔 Comanda a fost livrată
Nu mai sunt notificări.
Exemplul 2: Eroarea oprește forEach
Stream<int> citiri() async* {
yield 21;
yield 22;
throw StateError('senzor defect');
}
Future<void> main() async {
try {
await citiri().forEach((t) => print('$t °C'));
} on StateError catch (e) {
print('Oprit: ${e.message}');
}
}
Rezultat
21 °C
22 °C
Oprit: senzor defect
Greșeli frecvente
- Dai lui
forEacho funcțieasyncși te aștepți ca pașii să ruleze pe rând.forEachnu așteaptă future-urile returnate.
Comenzi înrudite
Stream.listen: Începe ascultarea unui stream: o funcție pentru fiecare valoare, una pentru erori, una pentru final.await for: Parcurge un Stream element cu element, așteptând fiecare eveniment; se termină când stream-ul se închide.Iterable.forEach: Apelează o funcție pentru fiecare element, în ordine.Future.forEach: forEach rulează o acțiune asincronă pe rând pentru fiecare element; doWhile repetă o acțiune cât timp returnează true.