Sound Null Safety și Type Promotion în Dart: Operatorii late, required, ?? și Garanții Riguroase la Compilare în Dart

Ghid aprofundat despre Sound Null Safety în Dart 3: cum funcționează arborele de tipuri cu Never și Object?, mecanismul de Type Promotion pe variabile locale și proprietăți private, operatorii ??, ??=, ?. și cuvântul cheie late.

Sintaxă
String? name; if (name != null) { print(name.length); } // Promovat automat la String

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).

Ierarhia de Tipuri și Mecanismul de Type Promotion
# 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).
Type Promotion pe Câmpuri Private (Dart 3.2+)
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}');
    }
  }
}