Ce face Stream.drain
drain() ascultă stream-ul până la final fără să facă nimic cu valorile. Este util când îți pasă doar că stream-ul s-a terminat (sau ai pus efectele în map). Opțional dai o valoare cu care se termină future-ul.
pipe(consumator) trimite toate valorile și erorile stream-ului către un StreamConsumer, de exemplu un StreamController sau un fișier deschis cu openWrite(), și apoi îl închide.
Parametri
| Parametru | Descriere |
|---|---|
futureValue |
Pentru drain: valoarea cu care se termină future-ul. |
streamConsumer |
Pentru pipe: destinația valorilor. |
Ce returnează
drain: un Future terminat la finalul stream-ului. pipe: un Future terminat după închiderea consumatorului.
Exemple
Exemplul 1: Așteaptă finalul, ignorând valorile
Stream<int> procesare() async* {
for (var i = 1; i <= 3; i++) {
await Future.delayed(const Duration(milliseconds: 5));
print(' procesat lotul $i');
yield i;
}
}
Future<void> main() async {
final mesaj = await procesare().drain('toate loturile sunt gata');
print(mesaj);
}
Rezultat
procesat lotul 1
procesat lotul 2
procesat lotul 3
toate loturile sunt gata
Exemplul 2: pipe într-un fișier
import 'dart:convert';
import 'dart:io';
Future<void> main() async {
final linii = Stream.fromIterable(['Ana,10\n', 'Mihai,8\n']).transform(utf8.encoder);
await linii.pipe(File('note.csv').openWrite());
print(File('note.csv').readAsStringSync());
}
Rezultat
Ana,10
Mihai,8
Greșeli frecvente
- Folosești
pipecătrestdout. După terminare,pipeînchide consumatorul, deci nu mai poți scrie nimic pe ecran.
Comenzi înrudite
Stream.forEach: Cheamă o funcție pentru fiecare valoare din stream și dă un Future care se termină la închiderea stream-ului.StreamController.addStream: Trimite în controller toate evenimentele altui stream; future-ul se termină când acel stream s-a terminat.File.openWrite: Deschide fișierul pentru scriere și returnează un IOSink în care scrii pe bucăți; trebuie închis cu close().IOSink: Destinația în care scrii text sau octeți: un fișier deschis (openWrite), stdout, stderr sau răspunsul HTTP.