Dart a implementat sistemul de Sound Null Safety ca cerință obligatorie începând cu versiunea 3.0 (codul vechi non-null-safe nu mai este acceptat de compilator). Spre deosebire de limbaje precum TypeScript unde siguranța la null este doar o verificare la compilare care dispare la runtime, în Dart sistemul este „Sound” (Garantat 100% de Mașina Virtuală și Compilatorul AOT).
Dacă o variabilă are tipul int, este fizic imposibil ca ea să conțină null în binarul compilat. Această certitudine matematică permite compilatorului să genereze cod mașină ultra-optimizat (fără verificări defensive ascunse de null).
# Arborele de Tipuri în Sound Null Safety:
# Object? (Super-tipul absolut: conține orice valoare + null)
# / \
# Object Null (Conține doar valoarea unică null)
# / \
# String int
# \ /
# Never (Sub-tipul absolut: nu conține nicio valoare)
void testPromotion(String? input) {
// Înainte de verificare, tipul este 'String?'
// input.length; // ❌ EROARE DE COMPILARE: input poate fi null!
if (input != null) {
// TYPE PROMOTION: În interiorul acestui bloc,
// compilatorul promovează automat tipul de la 'String?' la 'String'!
print('Lungime text: ${input.length}'); // COMPILARE VALIDĂ!
}
}
Operatorii Esențiali pentru Gestionarea Valorilor Null
| Operator | Nume Tehnic | Comportament |
|---|---|---|
?. |
Null-Aware Access | Apelează metoda sau proprietatea doar dacă instanța nu este null; altfel returnează null. |
?? |
If-Null / Coalescing | Evaluează expresia din stânga; dacă este null, returnează valoarea de rezervă din dreapta. |
??= |
Null-Aware Assignment | Atribuie valoarea doar dacă variabila este în prezent null. |
! |
Null Assertion (Bang) | Forțează compilatorul să considere valoarea ca non-null; aruncă o excepție runtime dacă este null. |
late |
Inițializare Întârziată | Declară o variabilă non-null a cărei inițializare are loc ulterior (la primul acces sau în initState). |
class UserManager {
// Câmp privat final garantat fără interferențe externe:
final String? _cachedToken;
UserManager(this._cachedToken);
void authenticate() {
// În Dart 3.2+, câmpurile private finale beneficiază automat de Type Promotion!
if (_cachedToken != null) {
// _cachedToken este promovat automat la non-null String:
print('Token valid cu lungimea: ${_cachedToken.length}');
}
}
}