StreamController.addStream în Dart

Trimite în controller toate evenimentele altui stream; future-ul se termină când acel stream s-a terminat.

Sintaxă
Future addStream(Stream<T> source, {bool? cancelOnError})

Ce face StreamController.addStream

addStream(sursa) ascultă stream-ul sursă și trimite mai departe fiecare valoare și eroare, ca și cum ai chema tu add și addError. Închiderea sursei nu închide controller-ul: poți adăuga apoi alte valori sau alte stream-uri.

Cât timp un addStream este în desfășurare, nu poți chema add, addError sau close; aștepți întâi future-ul. Așa poți lipi mai multe stream-uri unul după altul.

Parametri

Parametru Descriere
source Stream-ul ale cărui evenimente se trimit.
cancelOnError Opțional: dacă e true, prima eroare din sursă oprește copierea.

Ce returnează

Un Future care se termină când sursa s-a terminat.

Exemple

Exemplul 1: Lipirea a două liste de redare

import 'dart:async';

Stream<String> album(String nume, List<String> piese) async* {
  for (final p in piese) {
    await Future.delayed(const Duration(milliseconds: 5));
    yield '$nume - $p';
  }
}

Future<void> main() async {
  final playlist = StreamController<String>();
  final redare = playlist.stream.forEach(print);

  await playlist.addStream(album('Album 1', ['Piesa A', 'Piesa B']));
  playlist.add('--- pauză ---');
  await playlist.addStream(album('Album 2', ['Piesa C']));
  await playlist.close();
  await redare;
}

Rezultat

Album 1 - Piesa A
Album 1 - Piesa B
--- pauză ---
Album 2 - Piesa C

Exemplul 2: Un singur addStream o dată

import 'dart:async';

Future<void> main() async {
  final c = StreamController<int>();
  final toate = c.stream.toList();
  final copiere = c.addStream(Stream.fromIterable([1, 2, 3]));
  try {
    c.add(99);
  } on StateError catch (e) {
    print('Nu se poate în timpul addStream: ${e.message}');
  }
  await copiere;
  c.add(4);
  await c.close();
  print(await toate);
}

Rezultat

Nu se poate în timpul addStream: Cannot add event while adding a stream
[1, 2, 3, 4]

Greșeli frecvente

  • Chemi close() fără să aștepți addStream. Apare StateError; scrie await c.addStream(...) înainte.

Comenzi înrudite

  • StreamController.add: add trimite o valoare în stream, addError trimite o eroare, iar close trimite semnalul de final.
  • Stream.drain: drain consumă și aruncă toate valorile stream-ului; pipe trimite toate valorile către un StreamConsumer (de ex. un controller).
  • StreamSink: Interfața „capătului de scriere” al unui stream: add, addError, addStream, close și done.