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.