【发布时间】:2021-08-02 08:03:37
【问题描述】:
在大于 2.12.0 的 dart sdk 中,我们经常使用 '?'确保该参数也可以具有空值,但是如何转换数据类型?没有数据类型?或相反亦然。整理“int”的最佳方法是什么?不能是 'int' 类型。
【问题讨论】:
-
你可以询问一些代码以及你得到的错误。这是一个不完整的问题。
标签: flutter dart dart-null-safety
在大于 2.12.0 的 dart sdk 中,我们经常使用 '?'确保该参数也可以具有空值,但是如何转换数据类型?没有数据类型?或相反亦然。整理“int”的最佳方法是什么?不能是 'int' 类型。
【问题讨论】:
标签: flutter dart dart-null-safety
你可以像这样转换类型:
int? a = 2;
int b;
b = a.toInt();
或
int? a = 2;
int b;
b = (a as int);
与字符串相同,我们有.toString() 和as String。
【讨论】:
在处理字符串时,我会用一个空字符串来实例化变量。
例如而不是写
字符串?一种; 我会去的
字符串 a = ""; 这并不理想,但它是一个临时解决方案,尤其是在使用变量 a 作为命名构造函数时。
有了这个,我可以和平地使用 a 作为变量,而不用担心字符串?与 String 类型不同。
【讨论】:
我在我的一个 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
【讨论】:
!本质上等同于as String。
as String 比! bang 运算符更易读,但是! bang 运算符使代码更短!
将可空字符串 (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
}
【讨论】:
null 安全性是一种表示类型可以或不可以为 null 的方法,您没有在对象中包装任何内容,因此您没有任何要解包的内容。
也许您将此与函数式语言或 Java 中的可选类型混淆了。如果可选类型包含值,则可以对其进行解包。
使用 dart,谷歌做出了另一个决定,让用户可以编写干净的代码而不检查对象是否为空,反之亦然,因此有了空安全性,您就有了代码无法访问的数学证明为空引用。
所以,如果你需要解开空对象或者你不需要它,或者你需要这样的检查
foo(int? i) {
if (i != null) {
print(i + 1);
}
}
我想指出一位 dart 开发人员的一个很好的参考,描述了为什么谷歌会做出这个决定 https://medium.com/dartlang/why-nullable-types-7dd93c28c87a
【讨论】:
如果编译器知道可空变量已初始化,则可以将其赋予不可空变量,例如,这样可以:
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 未初始化,这将不起作用。
【讨论】: