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ă
onDataadaugă î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.