Future.asStream în Dart

Transformă un future într-un stream care emite o singură valoare (sau eroarea) și apoi se închide.

Sintaxă
Stream<T> asStream()

Ce face Future.asStream

asStream creează un Stream cu un singur eveniment: valoarea future-ului, urmată de închiderea stream-ului. Dacă future-ul se termină cu eroare, stream-ul emite eroarea.

Este util când un cod așteaptă un stream, iar tu ai doar un future, de exemplu ca să-l combini cu alte stream-uri sau să-l treci unei funcții care primește Stream.

Ce returnează

Un Stream<T> cu un singur eveniment.

Exemple

Exemplul 1: Un future folosit ca stream

Future<void> afiseazaTot(Stream<String> s) async {
  await for (final x in s) {
    print('primit: $x');
  }
  print('stream închis');
}

Future<void> main() async {
  final salut = Future.delayed(const Duration(milliseconds: 10), () => 'Bună ziua din Iași!');
  await afiseazaTot(salut.asStream());
}

Rezultat

primit: Bună ziua din Iași!
stream închis

Exemplul 2: Eroarea ajunge în stream

Future<void> main() async {
  final esuat = Future<int>.error(StateError('fără conexiune'));
  await esuat.asStream().handleError((Object e) => print('eroare în stream: $e')).drain<void>();
  print('gata');
}

Rezultat

eroare în stream: Bad state: fără conexiune
gata

Greșeli frecvente

  • Te aștepți ca stream-ul să emită de mai multe ori. Un future are o singură valoare, deci stream-ul are un singur eveniment.

Comenzi înrudite

  • Stream.fromFuture: fromFuture face un stream cu rezultatul unui future; fromFutures emite rezultatele mai multor future-uri în ordinea terminării.
  • Stream: Un șir de valori care sosesc în timp, una după alta (mesaje, clicuri, linii dintr-un fișier); îl parcurgi cu await for.
  • Future: O valoare care va fi gata mai târziu (citirea unui fișier, un răspuns de la server); o aștepți cu await.