Null Safety is een feature in Dart die helpt om null-gerelateerde runtime errors te voorkomen. Met Null Safety kun je expliciet aangeven of een variabele een null waarde kan hebben of niet. Dit helpt om fouten te vermijden die optreden wanneer je probeert een methode aan te roepen of een eigenschap te benaderen van een null object.
Basisprincipes van Null Safety
- Niet-null variabelen: Standaard kunnen variabelen in Dart geen
nullwaarde bevatten. - Nullable variabelen: Je kunt een variabele aangeven als
nullabledoor een vraagteken (?) toe te voegen aan het type.
Voorbeelden:
void main() {
int nietNullWaarde = 42; // Niet-null variabele
int? nullWaarde = null; // Nullable variabele
print(nietNullWaarde); // Output: 42
print(nullWaarde); // Output: null
}In dit voorbeeld is nietNullWaarde een niet-null variabele en nullWaarde een nullable variabele.
Null-checks
Je kunt null-checks uitvoeren om te controleren of een nullable variabele een waarde heeft voordat je deze gebruikt:
void main() {
int? mogelijkNull = 42;
if (mogelijkNull != null) {
print(mogelijkNull + 1); // Output: 43
}
}In dit voorbeeld voeren we een null-check uit voordat we een bewerking uitvoeren op mogelijkNull.
Null-aware operators
Dart biedt verschillende null-aware operators om het werken met nullable variabelen te vereenvoudigen:
?.: Null-aware toegang. Roep een methode of eigenschap aan alleen als de variabele niet null is.??: Null-coalescing operator. Gebruik een alternatief als de variabele null is.??=: Null-coalescing toekenning. Ken een waarde toe als de variabele null is.
Voorbeelden:
void main() {
int? mogelijkNull;
// Null-aware toegang
mogelijkNull?.toString(); // Geen fout, doet niets
// Null-coalescing operator
int waarde = mogelijkNull ?? 0;
print(waarde); // Output: 0
// Null-coalescing toekenning
mogelijkNull ??= 100;
print(mogelijkNull); // Output: 100
}Asserties voor null
Met asserties kun je ervoor zorgen dat een variabele niet null is op een bepaald punt in je code. Dit is vooral handig voor debugging en het expliciet maken van aannames in je code.
Voorbeeld:
void main() {
int? mogelijkNull = 42;
assert(mogelijkNull != null, 'De waarde mag niet null zijn');
print(mogelijkNull! + 1); // Het uitroepteken forceert een niet-null waarde
}In dit voorbeeld gebruiken we een assertie om te controleren of mogelijkNull niet null is voordat we deze gebruiken.
Late variabelen
Met het sleutelwoord late kun je aangeven dat een variabele later zal worden geïnitialiseerd. Dit is nuttig wanneer de initiële waarde van een variabele niet onmiddellijk beschikbaar is, maar je zeker weet dat deze niet null zal zijn wanneer deze voor het eerst wordt gebruikt.
Voorbeeld:
void main() {
late int waarde;
waarde = 10; // Initialisatie
print(waarde); // Output: 10
}In dit voorbeeld wordt de variabele waarde later geïnitialiseerd met de waarde 10.
Required parameters
Bij het definiëren van constructoren of functies kun je required gebruiken om aan te geven dat een parameter niet null mag zijn en moet worden opgegeven.
Voorbeeld:
class Persoon {
String naam;
int leeftijd;
Persoon({required this.naam, required this.leeftijd});
}
void main() {
Persoon persoon = Persoon(naam: 'Alice', leeftijd: 30);
print('Naam: ${persoon.naam}, Leeftijd: ${persoon.leeftijd}');
}In dit voorbeeld gebruiken we required om aan te geven dat de parameters naam en leeftijd verplicht zijn.
Default waarden
Je kunt default waarden instellen voor nullable parameters, zodat ze nooit null zijn als ze niet worden opgegeven.
Voorbeeld:
void printBericht({String? bericht = 'Hallo, wereld!'}) {
print(bericht);
}
void main() {
printBericht(); // Output: Hallo, wereld!
printBericht(bericht: 'Hallo, Dart!'); // Output: Hallo, Dart!
}In dit voorbeeld gebruiken we een default waarde voor de parameter bericht.
Null Safety is een krachtige feature in Dart die helpt om null-gerelateerde fouten te voorkomen. Door expliciet aan te geven of een variabele null kan zijn, kun je de betrouwbaarheid en veiligheid van je code verbeteren. Null Safety maakt het makkelijker om robuuste en foutbestendige applicaties te schrijven door null-checks, null-aware operators, late variabelen, asserties, en default waarden te gebruiken.