【问题标题】:! casts the expression to its underlying non-nullable type in Flutter!将表达式转换为 Flutter 中的底层不可为空类型
【发布时间】:2021-06-07 11:06:02
【问题描述】:

他们说是什么意思:

后缀感叹号 (!) 采用左侧的表达式并将其强制转换为其底层的不可为空的类型。

https://dart.dev/null-safety/understanding-null-safety#null-assertion-operator

这是否意味着它检查表达式是否为空,然后在进一步执行之前抛出错误?

请解释一下:

将其转换为其底层的不可为空的类型

【问题讨论】:

  • 它就像一个断言。如果变量可能为 null,则当您尝试访问其方法时,编译器会抛出错误。通过断言变量不会为空,您可以修复编译器错误。

标签: flutter dart


【解决方案1】:

这是否意味着它检查表达式是否为空,然后在进一步执行之前抛出错误?

是的,! 将插入一个空检查,如果在运行时表达式结果为 null,则该检查将引发 TypeError

"Null assertion operator" section的最后一段所述:

当然,像任何演员一样,使用! 会失去静态安全性。必须在运行时检查强制转换以保持健全性,它可能会失败并引发异常。

【讨论】:

    【解决方案2】:

    casts it to its underlying non-nullable type
    这意味着该变量可能是 nullable 但当您明确确定当前对变量的调用将 not 返回 null 时,您可以使用 ! 运算符暗示变量不为空。

    【讨论】:

      【解决方案3】:

      例如你有这个:

      List<ChatMessage?> messages;
      

      这将是一个消息列表。但它们可以为空。 消息有正文、id 等。 如果我尝试在列表中的消息上调用 id,如下所示:

      message.id
      

      在这种情况下消息可以为空,这将告诉我在调用 id 时消息不能为空。

      所以我们在这里做的是!到消息的末尾,然后它会转换为它的基础类型,此时不能为空(因为我们定义它不能与!),否则它会抛出错误:

      messages!.id
      

      【讨论】:

        猜你喜欢
        • 2022-01-22
        • 2014-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-30
        • 1970-01-01
        相关资源
        最近更新 更多