Ce face Stream.multi
La fiecare ascultare, Stream.multi cheamă funcția onListen cu un MultiStreamController nou. Prin el trimiți valori (add), erori (addError) și închizi stream-ul (close) doar pentru acel ascultător.
Astfel fiecare ascultător primește toate evenimentele de la început, spre deosebire de un stream broadcast. Este un mod simplu de a crea un stream cu evenimente exacte (valori și erori), util în teste.
Parametri
| Parametru | Descriere |
|---|---|
onListen |
Funcția chemată pentru fiecare ascultător nou, cu controller-ul lui. |
isBroadcast |
Opțional: dacă stream-ul se raportează ca broadcast. |
Ce returnează
Un Stream<T> care poate fi ascultat de mai multe ori.
Exemple
Exemplul 1: Fiecare ascultător primește totul
Future<void> main() async {
var ascultari = 0;
final meniu = Stream<String>.multi((c) {
ascultari++;
c.add('ciorbă');
c.add('sarmale');
c.close();
});
print(await meniu.toList());
print(await meniu.toList());
print('Ascultări: $ascultari');
}
Rezultat
[ciorbă, sarmale]
[ciorbă, sarmale]
Ascultări: 2
Exemplul 2: Valori și erori pentru un test
import 'dart:async';
Future<void> main() async {
final citiri = Stream<int>.multi((c) {
c.add(10);
c.addError(const FormatException('citire invalidă'));
c.add(12);
c.close();
});
final gata = Completer<void>();
citiri.listen(
(v) => print('valoare $v'),
onError: (Object e) => print('eroare: $e'),
onDone: gata.complete,
);
await gata.future;
print('gata');
}
Rezultat
valoare 10
eroare: FormatException: citire invalidă
valoare 12
gata
Greșeli frecvente
- Uiți
c.close(). Ascultătorii care așteaptă finalul (toList,await for) rămân blocați.
Comenzi înrudite
StreamController: Creează un stream pe care îl alimentezi tu: ce pui cu add ajunge la cei care ascultă controller.stream.Stream.asBroadcastStream: Transformă un stream obișnuit într-unul broadcast, care poate avea mai mulți ascultători în același timp.Stream.value: Stream-uri gata făcute: unul cu o singură valoare, unul cu o singură eroare și unul gol.