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.