StreamSubscription.onData în Dart

Înlocuiesc funcțiile unui abonament existent: cea pentru date, cea pentru erori și cea pentru final.

Sintaxă
void onData(void handleData(T data)?)
void onError(Function? handleError)
void onDone(void handleDone()?)

Ce face StreamSubscription.onData

Funcțiile date la listen pot fi schimbate mai târziu: onData pune o nouă funcție pentru valori, onError pentru erori, onDone pentru final. Fiecare apel înlocuiește funcția veche.

Sunt utile când creezi abonamentul înainte să ai funcția potrivită, de exemplu când funcția trebuie să folosească chiar variabila abonamentului (ca să-l anuleze).

Parametri

Parametru Descriere
handleData Funcția nouă pentru valori (sau null ca să le ignori).
handleError Funcția nouă pentru erori.
handleDone Funcția nouă pentru final.

Ce returnează

Nimic (void).

Exemple

Exemplul 1: Funcții puse după listen

import 'dart:async';

Future<void> main() async {
  final gata = Completer<void>();
  final s = Stream<int>.multi((c) {
    c.add(5);
    c.addError(StateError('mesaj pierdut'));
    c.add(7);
    c.close();
  });
  final abonament = s.listen(null);
  abonament.onData((n) => print('date: $n'));
  abonament.onError((Object e) => print('eroare: $e'));
  abonament.onDone(() {
    print('final');
    gata.complete();
  });
  await gata.future;
}

Rezultat

date: 5
eroare: Bad state: mesaj pierdut
date: 7
final

Exemplul 2: Schimbarea comportamentului în timpul ascultării

După primele două valori, abonamentul trece la o altă funcție, care doar numără.

import 'dart:async';

Future<void> main() async {
  final gata = Completer<void>();
  var numarate = 0;
  final abonament = Stream.fromIterable(['a', 'b', 'c', 'd', 'e']).listen(null, onDone: gata.complete);
  abonament.onData((x) {
    print('detaliat: $x');
    if (x == 'b') {
      abonament.onData((_) => numarate++);
    }
  });
  await gata.future;
  print('restul, doar numărate: $numarate');
}

Rezultat

detaliat: a
detaliat: b
restul, doar numărate: 3

Greșeli frecvente

  • Crezi că onData adaugă încă un ascultător. Înlocuiește funcția existentă; un abonament are o singură funcție pentru date.

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.
  • StreamSubscription.asFuture: Dă un Future care se termină când stream-ul se termină, sau cu eroare la prima eroare din stream.