首页 > 解决方案 > 如何将 Null 断言运算符与实例字段一起使用

问题描述

如果对象的字段可以为空,我无法理解如何键入提升对象的字段。假设我有以下 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?到一个不可为空的变量(字符串)。为了同样的效果,我应该如何将一个可为空的字段传递给一个需要非空参数的函数。

标签: flutterdartdart-null-safety

解决方案


您可以通过不同的方式修复它:

  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
    }
    

text注意:如果是.Bang 运算符可能会导致运行时错误null


推荐阅读