Stream.multi în Dart

Creează un stream care poate fi ascultat de mai multe ori; fiecare ascultător primește propriul controller.

Sintaxă
factory Stream<T>.multi(void onListen(MultiStreamController<T> controller), {bool isBroadcast = false})

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.