Flutter 也使用已经有一段时间了,虽然我不是什么很N的程序员,但我可以提供关于Flutter空安全(Null Safety)的一些使用经验和理解。希望对大家有所帮助
Dart空安全
空安全是什么?
在空安全下,运行时的NullPointer Exception错误被提前到了开发阶段。
即:
void main() { // 在空安全下, 开发阶段就会报错,而非运行时 String name; debugPrint(name); } 复制代码
类型上也有了变化,这里贴两张官方的类型关系图深入理解空安全 :
非空安全时代:
空安全时代
可以看到,Null这个类型变成了一个单独的类,而非所有类的子类,换言之:
void main() {
String a = null;
}
非空安全下:
因为Null是所有类型的子类,基于多态性的原理,这种书写方式是正确的。
在空安全下:
Null独立了出去,那么当你再像上面那样书写时,就会报错了,因为这本质上发生了类型转换的错误.
空安全是Flutter框架的一个关键特性,它旨在通过确保所有可能为空的值在运行时被检查,来提高代码的健壮性和可维护性。
-
声明变量为非空: 在Flutter中,你可以明确指定一个变量不能为空。例如,当你创建一个
String类型的变量时,你可以在赋值时使用??操作符,如var title = message??"";。这表示如果message为空,那么title将被赋值为""。 -
返回非空的默认值: 当你可能需要返回一个可能为空的值时,最好返回一个默认值。例如,在使用Dart的
Future时,你可以返回一个Future.error函数来捕获可能的错误。 -
使用空安全的API: 空安全并不仅限于Flutter框架,而是整个Dart语言都支持。你可以利用这个特性来编写更安全的代码,例如使用
String.isNullOrEmpty来检查字符串是否为空。 -
避免空引用: 在编程过程中,我们应尽可能避免直接使用可能为空的对象。例如,在处理用户输入时,你应该避免直接接受可能为空的字符串或布尔值,而是使用
String.fromCharCode或bool.parseBool这样的函数。 -
使用
??=操作符: 如果一个变量可能为空,你可以使用??=操作符来进行空安全的赋值操作。例如,var myArray = [1, 2, 3]; myArray??= [];将确保如果myArray为空,它将被赋值为一个空数组。 -
使用
isNull和isNotNull: 在需要检查是否为空的地方,可以使用isNull和isNotNull操作符,例如if (message is String) { /* ... */ }。
通过上述方式,你可以在Flutter中创建更安全、更可靠的应用程序。