Ce face StreamController.broadcast
Un controller broadcast trimite fiecare eveniment tuturor ascultătorilor din acel moment. Ascultătorii pot veni și pleca oricând. Spre deosebire de controller-ul obișnuit, evenimentele nu sunt păstrate: dacă nu ascultă nimeni, ele se pierd.
Este potrivit pentru evenimente de tip „anunț”: clicuri, schimbări de stare, mesaje dintr-un chat. onListen se cheamă când apare primul ascultător, iar onCancel când pleacă ultimul.
Parametri
| Parametru | Descriere |
|---|---|
onListen |
Opțional: chemat când stream-ul trece de la zero la un ascultător. |
onCancel |
Opțional: chemat când pleacă ultimul ascultător. |
sync |
Opțional: livrare imediată a evenimentelor. |
Ce returnează
Un controller al cărui stream este broadcast.
Exemple
Exemplul 1: Mai multe ecrane ascultă același scor
import 'dart:async';
Future<void> main() async {
final scor = StreamController<String>.broadcast();
final tabela = scor.stream.forEach((s) => print('Tabelă: $s'));
final aplicatie = scor.stream.forEach((s) => print('Aplicație: $s'));
scor.add('1-0');
scor.add('1-1');
await scor.close();
await Future.wait([tabela, aplicatie]);
}
Rezultat
Tabelă: 1-0
Aplicație: 1-0
Tabelă: 1-1
Aplicație: 1-1
Exemplul 2: Evenimentele fără ascultători se pierd
import 'dart:async';
Future<void> main() async {
final c = StreamController<int>.broadcast();
c.add(1);
final primite = c.stream.toList();
c.add(2);
c.add(3);
await c.close();
print(await primite);
}
Rezultat
[2, 3]
Greșeli frecvente
- Folosești un controller broadcast pentru date care nu au voie să se piardă, cum ar fi liniile unui fișier. Dacă ascultătorul vine mai târziu, pierde începutul; folosește un controller obișnuit.
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.StreamController.hasListener: hasListener spune dacă stream-ul controller-ului este ascultat acum; isClosed dacă s-a chemat deja close.