Stream.value în Dart

Stream-uri gata făcute: unul cu o singură valoare, unul cu o singură eroare și unul gol.

Sintaxă
Stream<T>.value(T value)
Stream<T>.error(Object error, [StackTrace? stackTrace])
const Stream<T>.empty({bool broadcast = true})

Ce face Stream.value

Stream.value(x) emite valoarea x și se închide. Stream.error(e) emite eroarea e și se închide. Stream.empty() se închide imediat, fără nicio valoare.

Sunt utile în teste și când o funcție trebuie să returneze un Stream, dar în anumite cazuri ai deja răspunsul (o valoare din cache, o eroare de validare, nimic de trimis).

Parametri

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

Ce returnează

Un stream cu un eveniment (sau fără niciunul) urmat de închidere.

Exemple

Exemplul 1: Funcție care returnează stream în toate cazurile

Stream<String> cauta(String text) {
  if (text.isEmpty) return const Stream.empty();
  if (text.length < 3) return Stream.error(ArgumentError('minim 3 litere'));
  if (text == 'iași') return Stream.value('Iași (din cache)');
  return Stream.fromIterable(['$text 1', '$text 2']);
}

Future<void> main() async {
  for (final t in ['', 'ia', 'iași', 'cluj']) {
    try {
      print('"$t": ${await cauta(t).toList()}');
    } on ArgumentError catch (e) {
      print('"$t": eroare ${e.message}');
    }
  }
}

Rezultat

"": []
"ia": eroare minim 3 litere
"iași": [Iași (din cache)]
"cluj": [cluj 1, cluj 2]

Exemplul 2: Evenimentele fiecărui stream

Future<void> arata(String nume, Stream<int> s) async {
  final evenimente = <String>[];
  await s.handleError((Object e) => evenimente.add('eroare: $e')).forEach((v) => evenimente.add('valoare $v'));
  evenimente.add('închis');
  print('$nume -> $evenimente');
}

Future<void> main() async {
  await arata('value', Stream.value(7));
  await arata('error', Stream.error(StateError('ups')));
  await arata('empty', const Stream.empty());
}

Rezultat

value -> [valoare 7, închis]
error -> [eroare: Bad state: ups, închis]
empty -> [închis]

Greșeli frecvente

  • Crezi că Stream.value emite valoarea imediat, sincron. Valoarea sosește tot asincron, după codul curent.

Comenzi înrudite

  • Future.value: Future.value creează un future deja terminat cu o valoare, iar Future.error unul terminat cu o eroare.
  • Stream.fromIterable: Creează un stream care emite, pe rând, elementele unei liste sau ale altui Iterable, apoi se închide.
  • Stream.fromFuture: fromFuture face un stream cu rezultatul unui future; fromFutures emite rezultatele mai multor future-uri în ordinea terminării.