StreamSubscription.pause în Dart

pause oprește temporar primirea evenimentelor, resume o reia, iar isPaused spune dacă abonamentul este în pauză.

Sintaxă
void pause([Future<void>? resumeSignal])
void resume()
bool get isPaused

Ce face StreamSubscription.pause

pause() cere stream-ului să nu mai trimită evenimente. La un stream obișnuit, evenimentele produse între timp sunt păstrate și sosesc după resume(); nu se pierd. Dacă dai un future la pause, abonamentul se reia singur când acel future se termină.

Pauzele se adună: dacă ai chemat pause de două ori, trebuie să chemi resume tot de două ori. isPaused este true cât timp există cel puțin o pauză.

Parametri

Parametru Descriere
resumeSignal Opțional: un future după care abonamentul se reia automat.

Ce returnează

pause și resume nu returnează nimic; isPaused returnează bool.

Exemple

Exemplul 1: Pauză în timpul unui apel

import 'dart:async';

Future<void> main() async {
  final c = StreamController<String>();
  final abonament = c.stream.listen((m) => print('notificare: $m'));

  c.add('Mesaj de la Ana');
  await Future.delayed(Duration.zero);

  abonament.pause();
  print('în apel, isPaused = ${abonament.isPaused}');
  c.add('Mesaj de la Mihai');
  c.add('Mesaj de la Ioana');
  await Future.delayed(const Duration(milliseconds: 20));

  print('apel încheiat');
  abonament.resume();
  await Future.delayed(Duration.zero);
  await c.close();
}

Rezultat

notificare: Mesaj de la Ana
în apel, isPaused = true
apel încheiat
notificare: Mesaj de la Mihai
notificare: Mesaj de la Ioana

Exemplul 2: Reluare automată cu resumeSignal

import 'dart:async';

Future<void> main() async {
  final gata = Completer<void>();
  final abonament = Stream.fromIterable([1, 2, 3]).listen(null, onDone: gata.complete);
  abonament.onData((n) {
    print('procesez $n');
    if (n == 1) {
      print('  pauză 30 ms');
      abonament.pause(Future.delayed(const Duration(milliseconds: 30)));
    }
  });
  await gata.future;
}

Rezultat

procesez 1
  pauză 30 ms
procesez 2
procesez 3

Greșeli frecvente

  • Pui pauză pe un abonament la un stream broadcast și te aștepți ca evenimentele să fie păstrate. La broadcast, evenimentele din timpul pauzei se pot pierde pentru acel ascultător.
  • Chemi pause de mai multe ori și resume o singură dată. Abonamentul rămâne în pauză.

Comenzi înrudite

  • StreamSubscription: Abonamentul returnat de listen; prin el pui pauză, reiei sau anulezi ascultarea unui stream (cancel).
  • StreamSubscription.onData: Înlocuiesc funcțiile unui abonament existent: cea pentru date, cea pentru erori și cea pentru final.
  • StreamController: Creează un stream pe care îl alimentezi tu: ce pui cu add ajunge la cei care ascultă controller.stream.