Stream.asBroadcastStream în Dart

Transformă un stream obișnuit într-unul broadcast, care poate avea mai mulți ascultători în același timp.

Sintaxă
Stream<T> asBroadcastStream({void onListen(StreamSubscription<T> subscription)?, void onCancel(StreamSubscription<T> subscription)?})

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.