StreamSubscription în Dart

Abonamentul returnat de listen; prin el pui pauză, reiei sau anulezi ascultarea unui stream (cancel).

Sintaxă
abstract interface class StreamSubscription<T>

StreamSubscription<T> s = stream.listen(...);
Future<void> cancel()

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.