Stream.cast în Dart

Prezintă stream-ul ca Stream<R>; fiecare valoare este verificată la rulare că are tipul R.

Sintaxă
Stream<R> cast<R>()

Ce face Stream.cast

cast<R>() nu schimbă valorile, ci doar tipul declarat al stream-ului. Când sosește o valoare, se verifică dacă este de tip R; dacă nu, stream-ul emite o eroare de tip.

Este util când primești un Stream<dynamic> sau Stream<Object?> despre care știi că are doar valori de un anumit tip. Dacă stream-ul are tipuri amestecate și vrei doar unele, filtrează întâi cu where((e) => e is R).

Ce returnează

Un Stream<R>.

Exemple

Exemplul 1: Din dynamic în String

Future<void> main() async {
  final Stream<dynamic> brut = Stream.fromIterable(<dynamic>['Iași', 'Cluj']);
  final Stream<String> orase = brut.cast<String>();
  await for (final o in orase) {
    print('${o.toUpperCase()} are ${o.length} litere');
  }
}

Rezultat

IAȘI are 4 litere
CLUJ are 4 litere

Exemplul 2: Filtrare apoi cast

Future<void> main() async {
  final amestecat = Stream<Object>.fromIterable([1, 'doi', 3, 'patru', 5]);
  final numere = amestecat.where((e) => e is int).cast<int>();
  print('Suma numerelor: ${await numere.fold<int>(0, (a, b) => a + b)}');
}

Rezultat

Suma numerelor: 9

Greșeli frecvente

  • Folosești cast pe un stream cu tipuri amestecate. Prima valoare de alt tip produce o eroare de tip; filtrează întâi.

Comenzi înrudite

  • Iterable.cast: Privește elementele ca fiind de alt tip; fiecare element este verificat abia când este citit.
  • Stream.where: Creează un stream nou care lasă să treacă doar valorile pentru care testul este adevărat.
  • as: Spune că o valoare are un anumit tip (cast); dacă nu are, aruncă TypeError. Tot as dă un prefix unui import.