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 invocation(??) 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.
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.
??
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
.
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";
}
}
© 2022 - 2024 — McMap. All rights reserved.