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.valueemite 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.