【问题标题】:What does the exclamation mark mean before a function call?函数调用前的感叹号是什么意思?
【发布时间】:2020-11-24 21:53:04
【问题描述】:

我在关注 Flutter 的 PR 时遇到了这段代码:

if (chunkCallback != null) {
  chunkCallback!(0, 100);
}

chunkCallback后面的感叹号是什么意思?我在 Google 上搜索的内容均无效。

【问题讨论】:

  • 也可以写成chunkCallback?.call(0, 100);
  • 谁投了反对票,如果你能解释一下,那会更有帮助,因为我可以改进我的问题。谢谢!
  • 是的@lrn,这实际上是在 PR 中提出的,但我的问题是关于“!”。不过感谢您的建议!
  • if 语句不是已经将 chunkCallback 的类型更改为在花括号内不可为空吗?

标签: dart


【解决方案1】:

"!" 是一个新的 dart 运算符,用于将 nullable 类型转换为 non-nullable 类型。 阅读 herehere 了解声音空值安全性。

仅在您绝对确定该值永远不会为 null 并且不要将其与 conditional property access 运算符混淆时才使用它。

【讨论】:

  • 如果方法为 null 并且我使用“!”调用它运营商,应用程序可能会崩溃。有没有办法安全地调用这个方法?
  • @JAHelia 是的,检查可能包含该方法的变量是否不等于 null
  • 正如@user13315601 的回答中提到的,您在谷歌上搜索的术语是“null-assertion-operator”
【解决方案2】:

chunkCallback 是对函数的可为空引用。

如果您确定 chunkCallback 在运行时不能为空,您可以通过添加 ! 来“消除可空性”以使编译器满意

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);
  }
}

本质上,! 在这种情况下是一个语法糖

(chunkCallback as WebOnlyImageCodecChunkCallback).call(0, 100);

【讨论】:

  • 终于有了一个理智、简洁、易懂的描述。
【解决方案3】:

我认为这是“消除可空性”的简写语法,根据文档:https://dart.dev/null-safety/understanding-null-safety#null-assertion-operator

【讨论】:

    猜你喜欢
    • 2012-04-20
    • 1970-01-01
    • 2011-01-11
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    相关资源
    最近更新 更多