Ce face Object?
În Dart toate clasele moștenesc din Object. Cu null safety, Object înseamnă „orice valoare care nu este null”, iar Object? înseamnă „orice valoare sau null”. Este tipul cel mai general din limbaj.
Pe o valoare Object? poți folosi doar ce are orice obiect: toString(), ==, hashCode, runtimeType. Pentru altceva verifici tipul cu is sau cu un switch pe tipuri; după verificare, variabila este promovată automat la tipul găsit.
Object? este alegerea bună când o funcție acceptă „orice”, dar vrei ca analizorul să te oblige să verifici tipul. dynamic face același lucru, dar fără verificare.
Exemple
Exemplul 1: Verificarea tipului cu is
După if (v is int), v este tratat ca int în acel bloc.
String descrie(Object? v) {
if (v == null) return 'nimic';
if (v is int) return 'număr întreg, dublul este ${v * 2}';
if (v is String) return 'text cu ${v.length} litere';
return 'altceva: ${v.runtimeType}';
}
void main() {
for (final v in [7, 'Suceava', null, 3.5]) {
print(descrie(v));
}
}
Rezultat
număr întreg, dublul este 14
text cu 7 litere
nimic
altceva: double
Exemplul 2: switch pe tipuri
Cu pattern-uri, un switch pe Object? tratează fiecare tip separat.
String format(Object? v) => switch (v) {
null => '-',
int n => '$n buc.',
double d => '${d.toStringAsFixed(2)} lei',
String s => '"$s"',
_ => v.toString(),
};
void main() {
print([3, 12.5, 'Cluj', null, true].map(format).toList());
}
Rezultat
[3 buc., 12.50 lei, "Cluj", -, true]
Exemplul 3: Object nu acceptă null
Un parametru Object primește orice valoare în afară de null; pentru null trebuie Object?.
void arata(Object valoare) => print('valoare: $valoare');
void arataOrice(Object? valoare) => print('valoare: ${valoare ?? "lipsă"}');
void main() {
arata(42);
arata('Galați');
// arata(null); // eroare: null nu este Object
arataOrice(null);
}
Rezultat
valoare: 42
valoare: Galați
valoare: lipsă
Greșeli frecvente
Object x = null;:A value of type 'Null' can't be assigned to a variable of type 'Object'. FoloseșteObject?.- Apelul
v.lengthpe unObject?fără verificare:The getter 'length' isn't defined for the type 'Object'. - Promovarea nu funcționează pe câmpurile publice ale unei clase (pot fi schimbate între verificare și folosire): copiază câmpul într-o variabilă locală.
Comenzi înrudite
dynamic: Tipul care dezactivează verificarea statică: orice metodă se poate apela, verificarea se face la rulare.is și is!: Verifică la rulare dacă o valoare are un anumit tip; după verificare, variabila poate fi folosită ca acel tip.null safety (? ! ?? ??=): Tipurile nu pot fi null decât dacă au ?; operatorii !, ?? și ??= lucrează cu valorile care pot lipsi.expresii switch: Forma de switch care produce o valoare: fiecare ramură este pattern => expresie.