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țiaddStream. ApareStateError; scrieawait 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.