Ce face Object
Orice valoare din Dart, în afară de null, este un Object: numere, texte, liste, funcții și obiectele claselor tale. O clasă fără extends extinde automat Object. De aceea orice obiect are metodele definite aici: ==, hashCode, toString(), noSuchMethod și runtimeType.
O variabilă de tip Object poate ține orice valoare nenulă, dar poți folosi direct doar metodele lui Object. Pentru restul verifici tipul cu is, iar Dart „promovează” variabila la tipul găsit. Dacă vrei să accepți și null, folosește Object?, tipul de sus al ierarhiei.
runtimeType returnează tipul real al obiectului în timpul rulării, ca obiect Type. Este util la depanare (print(x.runtimeType)). Pentru decizii în cod folosește is, care ține cont și de subclase.
Ce returnează
runtimeType: un Type.
Exemple
Exemplul 1: Orice valoare este un Object
class Student {
final String nume;
Student(this.nume);
}
void main() {
var valori = <Object>[42, 3.14, 'Iași', true, [1, 2], {'a': 1}, Student('Ana'), print];
for (var v in valori) {
print(v.runtimeType);
}
}
Rezultat
int
double
String
bool
List<int>
_Map<String, int>
Student
(Object?) => void
Exemplul 2: Verificarea tipului cu is
După if (v is String), Dart știe că v este text și permite v.length.
String descrie(Object? v) {
if (v == null) return 'nimic';
if (v is int) return 'întreg, dublul este ${v * 2}';
if (v is String) return 'text cu ${v.length} litere';
if (v is List) return 'listă cu ${v.length} elemente';
return 'alt tip: ${v.runtimeType}';
}
void main() {
for (var v in [7, 'Brașov', [1, 2, 3], 2.5, null]) {
print(descrie(v));
}
}
Rezultat
întreg, dublul este 14
text cu 6 litere
listă cu 3 elemente
alt tip: double
nimic
Greșeli frecvente
- Declari variabile
Objectși apoi apelezi metode specifice:Object x = 'Ana'; x.lengthnu compilează. Verifică întâi cuis String. - Compari tipuri cu
x.runtimeType == int. Nu funcționează pentru subclase și nici pentru tipuri interne (de exemplu listele au tipuri reale caList<int>). Foloseștex is int.
Comenzi înrudite
Object.toString: Returnează textul care descrie obiectul; îl folosesc print și interpolarea. Îl suprascrii în clasele tale.Object.hashCode: Un număr asociat obiectului, folosit de Set și Map; obiectele egale cu == trebuie să aibă același hashCode.Type: Un obiect care reprezintă un tip Dart, obținut scriind numele tipului sau cu runtimeType.Object?: Tipul de bază al tuturor valorilor din Dart, inclusiv null; varianta sigură a lui dynamic.is și is!: Verifică la rulare dacă o valoare are un anumit tip; după verificare, variabila poate fi folosită ca acel tip.