下面这行代码有两个问号:
final myStringList = prefs.getStringList('my_string_list_key') ?? [];
什么意思?
??双问号操作符的意思是“如果为空”。
??
String a = b ?? 'hello';
这意味着 a等于 b,但是如果 b为空,那么 a等于 'hello'。
a
b
'hello'
另一个相关的操作员是 ??=,例如:
??=
b ??= 'hello';
这意味着如果 b为空,那么将其设置为等于 hello。否则,不要更改它。
hello
参考文献
条款
Dart 1.12发布新闻统称为 空感知运算符:
x?.p
x?.m()
Dart 为处理可能为空的值提供了一些方便的操作符。其中一个是?= 赋值运算符,只有当变量当前为 null 时才赋值:
int a; // The initial value of a is null. a ??= 3; print(a); // <-- Prints 3. a ??= 5; print(a); // <-- Still prints 3.
另一个 空感知运算符是? ? ?,它返回左边的表达式,除非该表达式的值为 null,在这种情况下,它计算并返回右边的表达式:
print(1 ?? 3); // <-- Prints 1. print(null ?? 12); // <-- Prints 12.
这在 copyWith 方法中尤其有用,这种方法在 flutter 中经常用于覆盖。 下面是一个例子:
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"; } }
??是一个感知空值的运算符,表达式的意思是,如果 prefs实例中的 "my_string_list_key"的值是 null,那么将一个空列表分配给 myStringList。
prefs
"my_string_list_key"
null
myStringList
Null 操作符 ,返回其 left when the it's not null上的表达式,否则返回正确的表达式。
left when the it's not null
(??=) Null-aware 赋值 -这个操作符将值赋给它左边的变量,只有当该变量当前为 null 时才赋值。
(?.)Null-Aware access 此操作符通过尝试访问可能为空的对象的属性或方法来防止您的应用程序崩溃。 比如说,
String x; print(x.toUpperCase()); // WILL GIVE AN ERROR print(x?.toUpperCase()); // OUTPUT WILL BE NULL
(... ?) Null-Aware 扩展操作符 -此操作符阻止您使用扩展操作符添加 null 元素。