flutter - 如何将 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?到一个不可为空的变量(字符串)。为了同样的效果,我应该如何将一个可为空的字段传递给一个需要非空参数的函数。
解决方案
您可以通过不同的方式修复它:
使用局部变量(推荐)
final local = comment.text; // <-- Local variable if (local != null) { String text = local; }
使用
?.
并提供默认值String text = comment?.text ?? 'Default value';
使用 Bang 运算符
!
if (comment.text != null) { String text = comment.text!; // <-- Bang operator }
text
注意:如果是.Bang 运算符可能会导致运行时错误null
。
推荐阅读
- c# - WPF TreeView,IsExpanded 的 TwoWay 绑定不影响 C# 代码中的 GUI
- python - 使用 find() 从字符串变量中提取电子邮件
- python - django中招摇的网址
- reactjs - 安装反应时如何解决“未找到项目”错误
- c - 如何在C中分配字符串数组?
- ruby-on-rails - 如何检查数组中的每个单词是否包含子字符串并拒绝 Ruby on Rails 中的子字符串?
- swagger-2.0 - 如何使用 Spring Boot Open API 3 定义错误模式?
- gpflow - 对 SGPR 的 GPflow 多输出支持
- python - 无法将从 XPath 抓取的德语字符写入 CSV 文件
- r - R中的火山图:添加细节:仅着色公因数