Ce face Stream.first
first așteaptă prima valoare și apoi anulează ascultarea. last așteaptă până la închiderea stream-ului și dă ultima valoare. single verifică în plus că stream-ul are exact o valoare. elementAt(i) dă valoarea de la poziția i (de la 0).
Pe un stream gol, first, last și single se termină cu StateError. single dă eroare și dacă sunt mai multe valori, iar elementAt dă RangeError dacă nu există poziția.
Parametri
| Parametru | Descriere |
|---|---|
index |
Pentru elementAt: poziția valorii, de la 0. |
Ce returnează
Un Future<T> cu valoarea cerută.
Exemple
Exemplul 1: Prima, ultima și a treia valoare
Stream<String> sosiri() => Stream.fromIterable(['Ana', 'Mihai', 'Ioana', 'Radu']);
Future<void> main() async {
print('Primul sosit: ${await sosiri().first}');
print('Ultimul sosit: ${await sosiri().last}');
print('Al treilea: ${await sosiri().elementAt(2)}');
}
Rezultat
Primul sosit: Ana
Ultimul sosit: Radu
Al treilea: Ioana
Exemplul 2: single și stream-uri goale
Future<void> main() async {
print(await Stream.value('singurul rezultat').single);
try {
await Stream.fromIterable([1, 2]).single;
} on StateError catch (e) {
print('single: ${e.message}');
}
try {
await const Stream<int>.empty().first;
} on StateError catch (e) {
print('first: ${e.message}');
}
}
Rezultat
singurul rezultat
single: Too many elements
first: No element
Greșeli frecvente
- Folosești
lastpe un stream care nu se închide. Future-ul nu se termină niciodată. - Uiți că
firstconsumă stream-ul obișnuit: după el nu-l mai poți asculta.
Comenzi înrudite
Stream.firstWhere: Dă un Future cu prima valoare din stream care trece testul; cu orElse, o valoare de rezervă dacă nu există.Stream.take: take păstrează doar primele n valori și apoi închide stream-ul; skip sare peste primele n valori.Iterable.first: first și last dau primul și ultimul element; single dă singurul element și verifică faptul că este unul singur.Stream.length: length numără valorile până la închiderea stream-ului; isEmpty spune dacă stream-ul nu are nicio valoare.