Ce face as
valoare as String îi spune analizorului „tratează această valoare ca String”. La rulare se verifică: dacă valoarea nu este de fapt un String, apare un TypeError. Nu face conversii (nu transformă '5' în 5); pentru asta există int.parse.
Se folosește când tu știi mai mult decât analizorul, de exemplu la datele venite din JSON (date['varsta'] as int). Când nu ești sigur de tip, folosește is sau un pattern, care nu aruncă excepții.
Același cuvânt are și un alt rol: import 'dart:math' as math; pune toate numele bibliotecii sub prefixul math (math.pi), ca să eviți conflictele de nume.
Exemple
Exemplul 1: Cast pentru date din JSON
jsonDecode întoarce dynamic; cu as spunem ce tipuri ne așteptăm să găsim.
import 'dart:convert';
void main() {
final date = jsonDecode('{"nume": "Cristina", "varsta": 34, "orase": ["Iași", "Cluj"]}')
as Map<String, dynamic>;
final nume = date['nume'] as String;
final varsta = date['varsta'] as int;
final orase = (date['orase'] as List).cast<String>();
print('$nume, $varsta ani, a locuit în ${orase.join(' și ')}');
}
Rezultat
Cristina, 34 ani, a locuit în Iași și Cluj
Exemplul 2: Cast greșit
Valoarea este un String, nu un int, așa că as int aruncă TypeError.
void main() {
final Object pret = '25';
try {
final p = pret as int;
print(p + 1);
} on TypeError catch (e) {
print('Eroare: $e');
}
print('Corect: ${int.parse(pret as String) + 1}');
}
Rezultat
Eroare: type 'String' is not a subtype of type 'int' in type cast
Corect: 26
Exemplul 3: Prefix de import
Cu as math, numele din dart:math se scriu cu prefix.
import 'dart:math' as math;
void main() {
const raza = 3.0;
print('Aria cercului: ${(math.pi * raza * raza).toStringAsFixed(2)}');
print('Maximul: ${math.max(17, 42)}');
}
Rezultat
Aria cercului: 28.27
Maximul: 42
Greșeli frecvente
- Să crezi că
asconvertește valori:'25' as intaruncăTypeError, nu întoarce 25. aspeste tot în loc de verificări: o singură valoare neașteptată oprește programul. Preferăissau pattern-uri pentru date nesigure.lista as List<String>pentru o listă creată caList<dynamic>: eșuează chiar dacă elementele sunt texte. Foloseștelista.cast<String>()sauList<String>.from(lista).
Comenzi înrudite
is și is!: Verifică la rulare dacă o valoare are un anumit tip; după verificare, variabila poate fi folosită ca acel tip.import: Face disponibile în fișierul curent numele publice ale altei biblioteci: din SDK, dintr-un pachet sau din proiect.dynamic: Tipul care dezactivează verificarea statică: orice metodă se poate apela, verificarea se face la rulare.pattern-uri (destructurare): Desfac o valoare (record, listă, map, obiect) în variabile separate, într-o singură declarație.