“!”和“!”有什么区别?和 ”?” Dart 空安全中的运算符?

dev*_*uaz 14 dart flutter dart-null-safety

谁能解释一下使用它之间的区别:

final block = blocks?.first;
Run Code Online (Sandbox Code Playgroud)

和这个:

final block = blocks!.first;
Run Code Online (Sandbox Code Playgroud)

哪里blocks

List<Block>? blocks
Run Code Online (Sandbox Code Playgroud)

Ham*_*med 35

简而言之,第一行代码将返回nullifblocks null,第二行代码将返回throw an exceptionifblocksis null

当您使用时blocks?.first, 的值blocks可以为null,但是当您使用时blocks!.first,您通知编译器您确定不blocksnull

final block = blocks!.first;意味着您完全确信它List<Block>? blocks在块分配之前已初始化。

同样,在final block = blocks?.first;,中block可为,但在final block = blocks!.first;,中block不可为空

  List<Block>? blocks;
  ...
  // you are not sure blocks variable is initialized or not.
  // block is nullable.
  // return null if blocks is null.
  final Block? block = blocks?.first;

  // you are sure blocks variable is initialized.
  // block is not nullable.
  // throw an error if blocks is null.
  final Block block = blocks!.first;
Run Code Online (Sandbox Code Playgroud)