课程名称:Flutter从入门到进阶 实战携程网App 一网打尽核心技术
课程章节:Flutter2空安全适配指南
课程讲师:CrazyCodeBoy
课程内容
1.空安全的好处
空安全在 Kotlin、Swift等编程语言中都是支持的,Dart博众家所长,从 2.12 版本开始支持空安全。引入空安全的好处:
- 避免了在代码中大量使用模板代码,提高了代码质量;
- 将原本在运行期间出现的空指针错误,提前到编译期,减少了很多生产环境中的异常。
一旦项目中用到的 sdk 版本在 2.12 以后(即默认开启空安全检查),那么项目中用到的三方插件也要支持空安全,否则会编译异常。
2.空安全的适配
在进行空安全适配时,对于可空的变量,可以使用? 进行修饰,对于不可空的变量,可以在声明式直接进行初始化,或者使用 late 关键字标识为延迟初始化。
当遇到了形如这样的错误,多半是因为将一个 null 值传递给了一个不能为 null 的变量:
type ‘Null’ is not a subtype of type ‘xxx’
如果是在开发阶段,可以通过编译器的提示进行定位。如果出现在网络请求放回的数据中,就需要重点排查,避免带到线上。
在 Flutter2.12 以后,Null 不再作为所有类型的子类,而是作为一个单独的类型存在。总结一下空安全适配过程中用到的运算符:
- 可空修饰符(?),在空安全中,所有类型在默认情况下都是非空的。例如,有一个 String 类型的变量,那么它应该总是包含一个字符串。如果你想要一个 String 类型的变量接受任何字符串或者 null,通过在类型名称后添加一个问号(?)表示该变量可以为空。
- 空断言操作符(!),如果确定某个可为空的变量非空,可以使用空断言操作符 ! 使编译器将其视为非空。通过添加 ! 在表达式之后,可以将其赋值给一个非空变量。
- 关键字(late),有时变量(例如:类中的字段或顶级变量)应该是非空的,但不能立即给它们赋值。对于这种情况,可以使用 late 关键字。编译器会确定你会在使用前对变量赋值。如果在赋值前读取,会抛出错误。
课程收获
空安全只是在代码编辑阶段帮助我们提前发现可能出现的空异常问题,但这并不意味着程序不会出现空异常。开发者仍然需要对代码进行完善的边界判断,保证程序的健壮性。