StreamSink în Dart

Interfața „capătului de scriere” al unui stream: add, addError, addStream, close și done.

Sintaxă
import 'dart:async';

abstract interface class StreamSink<S> implements EventSink<S>, StreamConsumer<S>
void add(S event)
void addError(Object error, [StackTrace? stackTrace])
Future addStream(Stream<S> stream)
Future close()
Future get done

Ce face StreamSink

StreamSink descrie un obiect în care poți scrie evenimente. StreamController este unul (și are sink, o vedere care permite doar scrierea), iar IOSink-ul unui fișier deschis cu openWrite() este tot un StreamSink<List<int>>.

Când o funcție primește un StreamSink, poate trimite date fără să știe unde ajung: într-un controller, într-un fișier sau într-o conexiune. done este un future care se termină când sink-ul s-a închis.

Ce returnează

close și done returnează un Future care se termină la închidere.

Exemple

Exemplul 1: O funcție care scrie în orice sink

import 'dart:async';

void scrieRaport(StreamSink<String> sink) {
  sink.add('Raport vânzări');
  sink.add('Iași: 1200 lei');
  sink.add('Cluj: 950 lei');
  sink.close();
}

Future<void> main() async {
  final c = StreamController<String>();
  final linii = c.stream.toList();
  scrieRaport(c.sink);
  print(await linii);
}

Rezultat

[Raport vânzări, Iași: 1200 lei, Cluj: 950 lei]

Exemplul 2: Același cod, scriind într-un fișier

import 'dart:async';
import 'dart:convert';
import 'dart:io';

Future<void> scrieNote(StreamSink<List<int>> sink) async {
  for (final rand in ['Ana,10', 'Mihai,8']) {
    sink.add(utf8.encode('$rand\n'));
  }
  await sink.close();
}

Future<void> main() async {
  await scrieNote(File('note.csv').openWrite());
  print(File('note.csv').readAsStringSync().trim());
}

Rezultat

Ana,10
Mihai,8

Greșeli frecvente

  • Uiți să închizi sink-ul unui fișier. Datele pot rămâne nescrise, iar fișierul rămâne deschis.

Comenzi înrudite

  • StreamController: Creează un stream pe care îl alimentezi tu: ce pui cu add ajunge la cei care ascultă controller.stream.
  • StreamController.addStream: Trimite în controller toate evenimentele altui stream; future-ul se termină când acel stream s-a terminat.
  • IOSink: Destinația în care scrii text sau octeți: un fișier deschis (openWrite), stdout, stderr sau răspunsul HTTP.
  • StreamTransformer: Transformă un Stream<S> într-un Stream<T>; fromHandlers îl construiește din funcții pentru date, erori și final.