函数调用前的感叹号是什么意思?

Dav*_*vid 22 dart

我正在关注 Flutter 的 PR 并遇到了以下代码:

if (chunkCallback != null) {
  chunkCallback!(0, 100);
}
Run Code Online (Sandbox Code Playgroud)

后面的感叹号是什么意思chunkCallback?我在 Google 上搜索的任何东西都不起作用。

Spa*_*atz 32

"!"是一个新的 dart 运算符,用于从类型转换为不可空类型。在此处此处阅读有关声音零点安全的信息。

仅当您绝对确定该值永远不会为并且不要将其与条件属性访问运算符混淆时才使用它。

  • 正如 @user13315601 的回答中提到的,您在谷歌上搜索的术语是“null-assertion-operator” (3认同)

Pav*_*tov 8

chunkCallback is a nullable reference to a function.

If you are sure that chunkCallback can't be null at runtime you can "Cast away nullability" by adding ! to it to make compiler happy

typedef WebOnlyImageCodecChunkCallback = void Function(
    int cumulativeBytesLoaded, int expectedTotalBytes);

...

class Class1 {
  final WebOnlyImageCodecChunkCallback? chunkCallback;

  Class1(this.chunkCallback);

  void test() {
    if (chunkCallback == null) {
      throw Exception("chunkCallback is null");
    }

    chunkCallback!.call(0, 100);
  }
}
Run Code Online (Sandbox Code Playgroud)

Esentially, ! in this case is a syntactic sugar for

(chunkCallback as WebOnlyImageCodecChunkCallback).call(0, 100);
Run Code Online (Sandbox Code Playgroud)

  • 最后是一个理智、简洁且易于理解的描述。 (4认同)

小智 7

我认为这是“抛弃可空性”的速记语法,根据文档:https : //dart.dev/null-safety/understanding-null-safety#null-assertion-operator