StreamController.broadcast în Dart

Controller al cărui stream poate avea oricâți ascultători; fiecare primește evenimentele trimise cât timp ascultă.

Sintaxă
factory StreamController<T>.broadcast({void onListen()?, void onCancel()?, bool sync = false})

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.