Stream.first în Dart

first, last, single și elementAt dau un Future cu o anumită valoare din stream: prima, ultima, singura sau a n-a.

Sintaxă
Future<T> get first
Future<T> get last
Future<T> get single
Future<T> elementAt(int index)

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 last pe un stream care nu se închide. Future-ul nu se termină niciodată.
  • Uiți că first consumă 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.