Ce face Stream.asBroadcastStream
Un stream obișnuit acceptă un singur ascultător. asBroadcastStream() creează un stream broadcast peste el: mai mulți ascultători pot asculta în același timp, iar fiecare primește valorile care sosesc după ce a început să asculte.
Stream-ul original este ascultat o singură dată, la primul ascultător. Un ascultător care vine mai târziu nu primește valorile trecute.
Parametri
| Parametru | Descriere |
|---|---|
onListen |
Opțional: chemat când stream-ul original începe să fie ascultat. |
onCancel |
Opțional: chemat când nu mai ascultă nimeni. |
Ce returnează
Un stream broadcast (isBroadcast este true).
Exemple
Exemplul 1: Doi ascultători pe același stream
Stream<int> scor() async* {
for (final s in [1, 2, 3]) {
await Future.delayed(const Duration(milliseconds: 10));
yield s;
}
}
Future<void> main() async {
final meci = scor().asBroadcastStream();
print('broadcast: ${meci.isBroadcast}');
final tabela = meci.map((s) => 'Tabelă: scor $s').toList();
final comentator = meci.where((s) => s == 3).map((_) => 'Comentator: hat-trick!').toList();
print(await tabela);
print(await comentator);
}
Rezultat
broadcast: true
[Tabelă: scor 1, Tabelă: scor 2, Tabelă: scor 3]
[Comentator: hat-trick!]
Exemplul 2: Un ascultător întârziat pierde valorile trecute
Stream<String> stiri() async* {
for (final s in ['Știrea 1', 'Știrea 2', 'Știrea 3']) {
await Future.delayed(const Duration(milliseconds: 60));
yield s;
}
}
Future<void> main() async {
final s = stiri().asBroadcastStream();
final primul = s.toList();
await Future.delayed(const Duration(milliseconds: 90));
final alDoilea = s.toList();
print('de la început: ${await primul}');
print('venit târziu: ${await alDoilea}');
}
Rezultat
de la început: [Știrea 1, Știrea 2, Știrea 3]
venit târziu: [Știrea 2, Știrea 3]
Greșeli frecvente
- Te aștepți ca un ascultător nou să primească valorile deja trimise. Stream-urile broadcast nu păstrează istoricul.
Comenzi înrudite
StreamController.broadcast: Controller al cărui stream poate avea oricâți ascultători; fiecare primește evenimentele trimise cât timp ascultă.Stream: Un șir de valori care sosesc în timp, una după alta (mesaje, clicuri, linii dintr-un fișier); îl parcurgi cu await for.Stream.listen: Începe ascultarea unui stream: o funcție pentru fiecare valoare, una pentru erori, una pentru final.