【问题标题】:How to use the Null assertion operator with instance fields如何将 Null 断言运算符与实例字段一起使用
【发布时间】:2021-06-02 16:42:11
【问题描述】:

如果对象的字段可以为空,我无法理解如何键入提升对象的字段。假设我有以下 Comment 类并尝试访问其一个可为空的字段:

class Comment {
  final String? text;
  Comment(this.text); 
}

void main() {
  final comment = Comment("comment");
  
  if (comment.text!= null) {
    String text = comment!.text;
  }
}

Dart 编译器会给我一个错误,因为我试图将一个可为空的变量分配给一个不可为空的变量。根据我从研究这个主题中收集到的信息,不可能使用实例变量进行类型提升,因为可以修改实例变量,这会破坏声音的空安全性。我已经看到在这些情况下使用了 Null 断言运算符 (!.),但它似乎不适用于字段,只能用于方法。

使用 dart null-safety,我应该如何分配一个可为空的字段,例如 String?到一个不可为空的变量(字符串)。为了同样的效果,我应该如何将一个可为空的字段传递给一个需要非空参数的函数。

【问题讨论】:

  • 您将! 放在错误的位置。 comment 已知不为空;它的 member 不能保证是非空的,所以你需要做String text = comment.text!;.
  • 这正是我正在寻找的答案。谢谢!

标签: flutter dart dart-null-safety


【解决方案1】:

你可以用不同的方式修复它:

  1. 使用局部变量(推荐)

    final local = comment.text; // <-- Local variable
    if (local != null) {
      String text = local; 
    }
    
  2. 使用?. 并提供默认值

    String text = comment?.text ?? 'Default value';
    
  3. 使用 Bang 运算符!

    if (comment.text != null) {
      String text = comment.text!; // <-- Bang operator
    }
    

注意:如果 textnull,Bang 运算符可能会导致运行时错误。

【讨论】:

    猜你喜欢
    • 2016-06-28
    • 2014-02-16
    • 1970-01-01
    • 2021-06-03
    • 2021-05-27
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多