Object? în Dart

Tipul de bază al tuturor valorilor din Dart, inclusiv null; varianta sigură a lui dynamic.

Sintaxă
Object? x;       // orice valoare, inclusiv null
Object x;        // orice valoare, dar nu null

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ște Object?.
  • Apelul v.length pe un Object? 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.