Ce face TypeError
Compilatorul prinde majoritatea problemelor de tip. Unele apar însă abia la rulare, când valoarea reală nu are tipul așteptat: o conversie as greșită (valoare as int când valoarea este text), operatorul ! aplicat pe null, sau date dynamic din JSON folosite ca alt tip. În aceste cazuri se aruncă TypeError.
Mesajul spune ce tip s-a găsit și ce tip se aștepta, de exemplu type 'String' is not a subtype of type 'int' in type cast. Ca și celelalte Error-uri, semnalează o greșeală în cod: soluția este să verifici tipul înainte, cu is sau cu un pattern, nu să prinzi eroarea.
Exemple
Exemplul 1: Conversii greșite
void main() {
Object varsta = '21';
try {
var n = varsta as int;
print(n);
} on TypeError catch (e) {
print(e);
}
String? oras;
try {
print(oras!.length);
} on TypeError catch (e) {
print(e.runtimeType);
}
}
Rezultat
type 'String' is not a subtype of type 'int' in type cast
_TypeError
Exemplul 2: Date JSON citite în siguranță
În loc să convertim orbește cu as, verificăm tipul cu un pattern case.
import 'dart:convert';
void main() {
var date = jsonDecode('{"nume": "Ana", "varsta": "21"}') as Map<String, dynamic>;
try {
var varsta = date['varsta'] as int;
print(varsta);
} on TypeError {
print('varsta nu este număr în JSON');
}
var varsta = switch (date['varsta']) {
int v => v,
String s => int.tryParse(s) ?? 0,
_ => 0,
};
print('Vârsta: $varsta');
}
Rezultat
varsta nu este număr în JSON
Vârsta: 21
Greșeli frecvente
- Scrii
json['pret'] as double, iar JSON-ul conține10(unint). Conversia aruncăTypeError; folosește(json['pret'] as num).toDouble().
Comenzi înrudite
as: Spune că o valoare are un anumit tip (cast); dacă nu are, aruncă TypeError. Tot as dă un prefix unui import.is și is!: Verifică la rulare dacă o valoare are un anumit tip; după verificare, variabila poate fi folosită ca acel tip.Error: Clasa de bază pentru greșelile de programare (index greșit, argument invalid); stackTrace arată unde a fost aruncată.null safety (? ! ?? ??=): Tipurile nu pot fi null decât dacă au ?; operatorii !, ?? și ??= lucrează cu valorile care pot lipsi.