Stream.toList în Dart

Adună toate valorile stream-ului într-o listă (sau într-un set) când stream-ul se închide.

Sintaxă
Future<List<T>> toList()
Future<Set<T>> toSet()

Ce face Stream.toList

toList() ascultă stream-ul până la închidere și dă o listă cu toate valorile, în ordinea sosirii. toSet() face la fel, dar elimină duplicatele.

Dacă stream-ul emite o eroare, future-ul se termină cu acea eroare. Pe un stream infinit nu se termină niciodată; limitează-l întâi cu take.

Ce returnează

Future<List<T>>, respectiv Future<Set<T>>.

Exemple

Exemplul 1: Toate mesajele într-o listă

Stream<String> chat() async* {
  yield 'Ana: Salut!';
  await Future.delayed(const Duration(milliseconds: 10));
  yield 'Mihai: Bună, ce faci?';
  yield 'Ana: Bine, mersi.';
}

Future<void> main() async {
  final mesaje = await chat().toList();
  print('${mesaje.length} mesaje');
  mesaje.forEach(print);
}

Rezultat

3 mesaje
Ana: Salut!
Mihai: Bună, ce faci?
Ana: Bine, mersi.

Exemplul 2: Vizitatori unici cu toSet

Future<void> main() async {
  final vizite = Stream.fromIterable(['ana', 'radu', 'ana', 'ioana', 'radu']);
  final unici = await vizite.toSet();
  print('Vizitatori unici: $unici');
}

Rezultat

Vizitatori unici: {ana, radu, ioana}

Greșeli frecvente

  • Folosești toList() pe Stream.periodic fără take. Programul așteaptă la nesfârșit.

Comenzi înrudite

  • Stream.length: length numără valorile până la închiderea stream-ului; isEmpty spune dacă stream-ul nu are nicio valoare.
  • Stream.fold: Combină toate valorile stream-ului într-un singur rezultat (sumă, maxim, text); fold pornește de la o valoare dată.
  • Iterable.toList: toList copiază elementele într-o listă nouă; toSet le copiază într-un set nou, fără duplicate.
  • Stream.take: take păstrează doar primele n valori și apoi închide stream-ul; skip sare peste primele n valori.