Ce face StreamSubscription
Când chemi stream.listen(...), primești un StreamSubscription. El reprezintă legătura dintre ascultător și stream și îți permite să controlezi ascultarea: pause, resume, cancel, sau să schimbi funcțiile cu onData, onError, onDone.
cancel() oprește definitiv ascultarea: nu mai primești evenimente, iar sursa poate elibera resurse (de exemplu un timer sau un fișier). Returnează un Future care se termină după ce curățenia s-a făcut. Într-o aplicație, anulează abonamentele de care nu mai ai nevoie, altfel rămân active.
Ce returnează
cancel returnează un Future<void>.
Exemple
Exemplul 1: Anularea unui stream infinit
import 'dart:async';
Future<void> main() async {
final ceas = Stream.periodic(const Duration(milliseconds: 20), (i) => i + 1);
late final StreamSubscription<int> abonament;
final gata = Completer<void>();
abonament = ceas.listen((secunda) async {
print('tic $secunda');
if (secunda == 3) {
await abonament.cancel();
gata.complete();
}
});
await gata.future;
print('ascultare oprită');
}
Rezultat
tic 1
tic 2
tic 3
ascultare oprită
Exemplul 2: cancel anunță sursa
import 'dart:async';
Future<void> main() async {
final c = StreamController<String>(onCancel: () => print('[sursa: eliberez conexiunea]'));
final abonament = c.stream.listen((m) => print('mesaj: $m'));
c.add('Salut!');
await Future.delayed(Duration.zero);
await abonament.cancel();
print('anulat');
}
Rezultat
mesaj: Salut!
[sursa: eliberez conexiunea]
anulat
Greșeli frecvente
- Nu anulezi abonamentele la stream-uri care nu se închid singure (timere, evenimente). Ele rămân active și consumă resurse.
Comenzi înrudite
Stream.listen: Începe ascultarea unui stream: o funcție pentru fiecare valoare, una pentru erori, una pentru final.StreamSubscription.pause: pause oprește temporar primirea evenimentelor, resume o reia, iar isPaused spune dacă abonamentul este în pauză.StreamSubscription.onData: Înlocuiesc funcțiile unui abonament existent: cea pentru date, cea pentru erori și cea pentru final.StreamSubscription.asFuture: Dă un Future care se termină când stream-ul se termină, sau cu eroare la prima eroare din stream.