Ce face StreamController.add
add(valoare) trimite un eveniment cu date. addError(eroare) trimite un eveniment de eroare: ascultătorul îl primește în onError, iar într-un await for eroarea este aruncată. Stream-ul nu se închide după o eroare.
close() trimite evenimentul „done”: ascultătorul primește onDone, iar buclele await for se termină. După close, add aruncă StateError. Future-ul returnat de close se termină după ce finalul a ajuns la ascultător.
Parametri
| Parametru | Descriere |
|---|---|
event |
Valoarea trimisă. |
error / stackTrace |
Eroarea trimisă și, opțional, stiva. |
Ce returnează
add și addError nu returnează nimic; close returnează un Future.
Exemple
Exemplul 1: Date, o eroare și finalul
import 'dart:async';
Future<void> main() async {
final temperaturi = StreamController<double>();
final ascultare = temperaturi.stream.listen(
(t) => print('$t °C'),
onError: (Object e) => print('eroare: $e'),
onDone: () => print('senzor oprit'),
);
temperaturi.add(21.5);
temperaturi.addError(const FormatException('citire invalidă'));
temperaturi.add(22.0);
await temperaturi.close();
await ascultare.cancel();
}
Rezultat
21.5 °C
eroare: FormatException: citire invalidă
22.0 °C
senzor oprit
Exemplul 2: add după close
import 'dart:async';
Future<void> main() async {
final c = StreamController<String>();
final toate = c.stream.toList();
c.add('Ana');
await c.close();
try {
c.add('Mihai');
} on StateError catch (e) {
print('Eroare: ${e.message}');
}
print(await toate);
}
Rezultat
Eroare: Cannot add event after closing
[Ana]
Greșeli frecvente
- Aștepți
await c.close()pe un controller pe care nu-l ascultă nimeni. Future-ul nu se termină până nu apare un ascultător care primește finalul. - Trimiți o eroare cu
addErrorși nimeni nu areonError. Eroarea devine netratată.
Comenzi înrudite
StreamController: Creează un stream pe care îl alimentezi tu: ce pui cu add ajunge la cei care ascultă controller.stream.StreamController.addStream: Trimite în controller toate evenimentele altui stream; future-ul se termină când acel stream s-a terminat.StreamController.hasListener: hasListener spune dacă stream-ul controller-ului este ascultat acum; isClosed dacă s-a chemat deja close.StreamSink: Interfața „capătului de scriere” al unui stream: add, addError, addStream, close și done.