Stream.drain în Dart

drain consumă și aruncă toate valorile stream-ului; pipe trimite toate valorile către un StreamConsumer (de ex. un controller).

Sintaxă
Future<E> drain<E>([E? futureValue])
Future pipe(StreamConsumer<T> streamConsumer)

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 pipe către stdout. 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.