What are the ?? double question marks in Dart?

Dart offers some handy operators for dealing with values that might be null. One is the ??= assignment operator, which assigns a value to a variable only if that variable is currently null:

int a; // The initial value of a is null.
a ??= 3;
print(a); // <-- Prints 3.

a ??= 5;
print(a); // <-- Still prints 3.

Another null-aware operator is ??, which returns the expression on its left unless that expression’s value is null, in which case it evaluates and returns the expression on its right:

print(1 ?? 3); // <-- Prints 1.
print(null ?? 12); // <-- Prints 12.

(??) null operator, it returns the expression on its left when the it's not null, otherwise it'll return the right expression.

(??=) Null-aware assignment - This operator assigns value to the variable on its left, only if that variable is currently null.

(?.) Null-Aware access This operator prevents you from crashing your app by trying to access a property or a method of an object that might be null. For example,

String x;
print(x.toUpperCase());   // WILL GIVE AN ERROR
print(x?.toUpperCase()); // OUTPUT WILL BE NULL

(...?) Null-Aware spread operator - This operator prevents you from adding null elements using spread operator.


The ?? double question mark operator means "if null". Take the following expression, for example.

String a = b ?? 'hello';

This means a equals b, but if b is null then a equals 'hello'.

Another related operator is ??=. For example:

b ??= 'hello';

This means if b is null then set it equal to hello. Otherwise, don't change it.

Reference

  • A Tour of the Dart Language: Operators
  • Null-aware operators in Dart

Terms

The Dart 1.12 release news collectively referred to the following as null-aware operators:

  • ?? -- if null operator
  • ??= -- null-aware assignment
  • x?.p -- null-aware access
  • x?.m() -- null-aware method invocation

Tags:

Operators

Dart