The following line of code has two question marks:
final myStringList = prefs.getStringList('my_string_list_key') ?? [];
What is the meaning?
The following line of code has two question marks:
final myStringList = prefs.getStringList('my_string_list_key') ?? [];
What is the meaning?
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
Terms
The Dart 1.12 release news collectively referred to the following as null-aware operators:
?? -- if null operator??= -- null-aware assignmentx?.p -- null-aware accessx?.m() -- null-aware method invocationDart 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.
This is especially useful in the copyWith method which is used in flutter very often to override. Here is an example below:
import './color.dart';
import './colors.dart';
class CoreState {
final int counter;
final Color backgroundColor;
const CoreState({
this.counter = 0,
this.backgroundColor = Colors.white,
});
CoreState copyWith({
int? counter,
Color? backgroundColor,
}) =>
CoreState(
counter: counter ?? this.counter,
backgroundColor: backgroundColor ?? this.backgroundColor,
);
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is CoreState &&
runtimeType == other.runtimeType &&
counter == other.counter &&
backgroundColor == other.backgroundColor;
@override
int get hashCode => counter.hashCode ^ backgroundColor.hashCode;
@override
String toString() {
return "counter: $counter\n"
"color:$backgroundColor";
}
}
?? is a null-aware operator, the expression means that, if the value of "my_string_list_key" in the prefs instance is null then assign an empty list to myStringList.