StreamController.add în Dart

add trimite o valoare în stream, addError trimite o eroare, iar close trimite semnalul de final.

Sintaxă
void add(T event)
void addError(Object error, [StackTrace? stackTrace])
Future close()

Ce face StreamController.add

add(valoare) trimite un eveniment cu date. addError(eroare) trimite un eveniment de eroare: ascultătorul îl primește în onError, iar într-un await for eroarea este aruncată. Stream-ul nu se închide după o eroare.

close() trimite evenimentul „done”: ascultătorul primește onDone, iar buclele await for se termină. După close, add aruncă StateError. Future-ul returnat de close se termină după ce finalul a ajuns la ascultător.

Parametri

Parametru Descriere
event Valoarea trimisă.
error / stackTrace Eroarea trimisă și, opțional, stiva.

Ce returnează

add și addError nu returnează nimic; close returnează un Future.

Exemple

Exemplul 1: Date, o eroare și finalul

import 'dart:async';

Future<void> main() async {
  final temperaturi = StreamController<double>();
  final ascultare = temperaturi.stream.listen(
    (t) => print('$t °C'),
    onError: (Object e) => print('eroare: $e'),
    onDone: () => print('senzor oprit'),
  );

  temperaturi.add(21.5);
  temperaturi.addError(const FormatException('citire invalidă'));
  temperaturi.add(22.0);
  await temperaturi.close();
  await ascultare.cancel();
}

Rezultat

21.5 °C
eroare: FormatException: citire invalidă
22.0 °C
senzor oprit

Exemplul 2: add după close

import 'dart:async';

Future<void> main() async {
  final c = StreamController<String>();
  final toate = c.stream.toList();
  c.add('Ana');
  await c.close();
  try {
    c.add('Mihai');
  } on StateError catch (e) {
    print('Eroare: ${e.message}');
  }
  print(await toate);
}

Rezultat

Eroare: Cannot add event after closing
[Ana]

Greșeli frecvente

  • Aștepți await c.close() pe un controller pe care nu-l ascultă nimeni. Future-ul nu se termină până nu apare un ascultător care primește finalul.
  • Trimiți o eroare cu addError și nimeni nu are onError. Eroarea devine netratată.

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.
  • StreamController.hasListener: hasListener spune dacă stream-ul controller-ului este ascultat acum; isClosed dacă s-a chemat deja close.
  • StreamSink: Interfața „capătului de scriere” al unui stream: add, addError, addStream, close și done.