在大于 2.12.0 的 dart sdk 中,我们经常使用 '?'确保该参数也可以具有空值,但是如何使用 ?数据类型没有?或相反亦然。什么可以是最喜欢的方式来整理“int”?不能是“int”类型。
答案 0 :(得分:2)
null 安全是一种表示类型可以或不可以为 null 的方法,您没有在对象内包装任何东西,因此您没有任何东西可以解包。
也许您将其与函数式语言或 Java 中的可选类型混淆了。如果一个可选类型包含一个值,它可以被解包。
使用 dart,谷歌做出另一个决定,让用户有可能在不检查对象是否为 null 的情况下编写干净的代码,反之亦然,因此使用 null 安全性,您可以获得代码无法访问的数学证明到空引用。
所以,如果你需要解开空对象或者你不需要它,或者你需要这样的检查
foo(int? i) {
if (i != null) {
print(i + 1);
}
}
我想指出一位 dart 开发人员的重要参考资料,其中描述了为什么谷歌做出这个决定https://medium.com/dartlang/why-nullable-types-7dd93c28c87a
答案 1 :(得分:1)
将可空字符串 (String?
) 分配给不可空字符串 (String
) 时会出现此错误。例如:
String? s = 'a';
int expectsString(String s) => s.length;
void main() {
expectsString(s); // <-- Error
}
解决方案是提供一个不可为空的 String
。您可以使用:
(1) 局部变量:
void main() {
var s1 = s; // Local variable
expectsString(s1 ?? 'default value');
}
(2) Bang 运算符:
void main() {
expectsString(s!); // Bang operator
}
答案 2 :(得分:0)
如果编译器知道可空变量已初始化,您可以将其赋予不可空变量,例如,这有效:
String? a; //a is nullable
a = 'some value'; // a is initialized
String b = ''; // b is not nullable
b = a; //b can receive a once a is initialized
那是因为编译器知道 a 不为空,但如果 a 没有初始化,这将不起作用。
答案 3 :(得分:0)
我在我的一个 flutter 应用程序中遇到了类似的问题,我已经通过从 String?
到 String
的类型转换修复了它。
就像下面的代码:
// I'm using a List with one element to generate the same error,
// because the error doesn't happen for one single variable.
List<String?> imageUrls = ['https://www.example.com/example_image.png',];
// you cast the element imageUrls[0] with 'as' keyword from String? to String
NetworkImage(imageUrls[0] as String); // NetworkImage() takes String parameter
答案 4 :(得分:0)
处理字符串时,我会用空字符串实例化变量。
例如而不是写作
字符串?一种; 我会一起去
字符串 a = ""; 这并不理想,但它是一种临时解决方案,尤其是在使用变量 a 作为命名构造函数时。
有了这个,我可以和平地使用 a 作为变量而不必担心 String?与 String 的类型不同。