Dart 中的? ? 双重问号是什么?

下面这行代码有两个问号:

final myStringList = prefs.getStringList('my_string_list_key') ?? [];

什么意思?

77978 次浏览

??双问号操作符的意思是“如果为空”。

String a = b ?? 'hello';

这意味着 a等于 b,但是如果 b为空,那么 a等于 'hello'

另一个相关的操作员是 ??=,例如:

b ??= 'hello';

这意味着如果 b为空,那么将其设置为等于 hello。否则,不要更改它。

参考文献

条款

Dart 1.12发布新闻统称为 空感知运算符:

  • ??—— if 空运算符
  • ??=——空感知赋值
  • 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

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 元素。