StreamSubscription.asFuture în Dart

Dă un Future care se termină când stream-ul se termină, sau cu eroare la prima eroare din stream.

Sintaxă
Future<E> asFuture<E>([E? futureValue])

Ce face StreamSubscription.asFuture

asFuture înlocuiește onDone și onError ale abonamentului: future-ul se termină cu futureValue când stream-ul se închide, sau cu prima eroare (după care abonamentul este anulat).

Este un mod scurt de a aștepta finalul unui stream ascultat cu listen. Dacă vrei să tratezi erorile fără să oprești ascultarea, nu folosi asFuture, ci onDone cu un Completer.

Parametri

Parametru Descriere
futureValue Opțional: valoarea cu care se termină future-ul la finalul stream-ului.

Ce returnează

Un Future<E>.

Exemple

Exemplul 1: Așteaptă finalul unui listen

Future<void> main() async {
  var total = 0;
  final abonament = Stream.fromIterable([150, 230, 75]).listen((suma) => total += suma);
  final mesaj = await abonament.asFuture('toate plățile au fost procesate');
  print(mesaj);
  print('Total: $total lei');
}

Rezultat

toate plățile au fost procesate
Total: 455 lei

Exemplul 2: Prima eroare termină future-ul

Stream<int> plati() async* {
  yield 100;
  throw StateError('card refuzat');
}

Future<void> main() async {
  final abonament = plati().listen((p) => print('plată: $p lei'));
  try {
    await abonament.asFuture<void>();
  } on StateError catch (e) {
    print('Oprit: ${e.message}');
  }
}

Rezultat

plată: 100 lei
Oprit: card refuzat

Greșeli frecvente

  • Dai onError la listen și apoi chemi asFuture. asFuture înlocuiește funcția ta, iar prima eroare oprește tot.

Comenzi înrudite

  • StreamSubscription: Abonamentul returnat de listen; prin el pui pauză, reiei sau anulezi ascultarea unui stream (cancel).
  • Stream.listen: Începe ascultarea unui stream: o funcție pentru fiecare valoare, una pentru erori, una pentru final.
  • Stream.drain: drain consumă și aruncă toate valorile stream-ului; pipe trimite toate valorile către un StreamConsumer (de ex. un controller).
  • StreamSubscription.onData: Înlocuiesc funcțiile unui abonament existent: cea pentru date, cea pentru erori și cea pentru final.