【发布时间】:2022-06-17 06:09:42
【问题描述】:
我正在使用 this 存储库来熟悉 Amazon 的 Cognito 用户系统。在文件 lib/screens/signup_screen.dart 中,从第 27 行开始有这段代码:
TextFormField(
keyboardType: TextInputType.emailAddress,
decoration: InputDecoration(labelText: "Email"),
controller: _emailController,
validator: (value) =>
!validateEmail(value) ? "Email is Invalid" : null,
),
但是,由于我们在 Dart 2.x 版本中具有空安全性,因此这段代码失败并显示错误消息:The argument type 'String?' can't be assigned to the parameter type 'String'。
我从中得到的是 value 可能不等于 null 并且代码不能保证它是这样的。如果我错了,请纠正我,我也希望有人能向我解释为什么代码不能保证这里的空安全性。如果文本字段为空,value 应该等于 "" 而不是 null。
无论如何,我决定使用三元运算符来解决这个问题:
!validateEmail(value == null ? "" : value) ? ...
IDE 建议我更正:
!validateEmail(value ?? "") ? ...
Dart 还建议插入一个空检查作为另一种选择:
!validateEmail(value!) ? ....
到目前为止,我只是将这些修复作为一种解决方法来快速生成代码,而无需尝试了解实际发生的情况。
那么这些方法有什么区别呢?第二种方法中的??是否集成了== null检查,和写value == null ? "" : value完全一样吗?
另外,nullcheck value! 有什么作用?是的,它会检查 value 是否等于 null,但是当 value 实际上等于 null 时,它对我有什么作用?
【问题讨论】: