共计 1819 个字符,预计需要花费 5 分钟才能阅读完成。
Flutter 是一套挪动 UI 框架,能够疾速在 iOS、Android 上构建高质量的原生用户界面。作为其官方语言 Dart 是类型平安的,当开发者获取变量的时候,编译器能够保障变量的类型,但类型平安并不保障获取的变量不是null
。
在 GitHub 上有十分多因为 null
导致 Dart 代码出现异常的 issue,为了从源头上解决 Null errors,Dart 团队在 2.12 版本中反对空平安(Sound null safety)个性,相应的 Flutter 降级到了 2.0。
详解空平安个性
当抉择应用空平安时,代码中的类型将默认为非空,意味着除非你申明它们可空,它们的值都不能为空。有了空平安,本来处于运行时的空值援用谬误将提前到编译期。
为了反对空平安个性,Dart 新增了操作符和关键字:
? -> 可空 如:int a?;
! -> 非空 如;int b = a!;
late -> 提早初始化 如:late int a;
上面咱们以 Express SDK 反对空平安为例,对以上操作符和关键字进行一一介绍。
1、操作符:?
在 Express SDK 的开发中,因为接口应用的便利性,咱们会在接口中内置化一些默认值,同时如果开发者想应用高阶的个性,可自行进行配置,那就须要参数是可空的,在类型前面增加 ?
即可:
loginRoom(String roomID, ZegoUser user, {ZegoRoomConfig? config})
Express SDK 事件回调个别都是用可选监听的,所以定义回调事件的办法时都是应用的?
,示意监听可空。
static void Function(ZegoEngineState state)? onEngineStateUpdate;
2、操作符:!
当咱们在做事件回传的时候,会对回调办法做判空推出解决,保障后续的应用不会呈现空值援用,能够应用 ”!” 来通知编辑器,这个值不会为空。
case 'onEngineStateUpdate':
if (ZegoExpressEngine.onEngineStateUpdate == null) return;
ZegoExpressEngine.onEngineStateUpdate!(...);
break;
3、关键字:late
当须要解决延时初始化这种常见的行为时,能够应用 late
来通知编辑器,这是个非空变量,会稍后初始化。
class RTC {
late ZegoExpressEngine engine;
ZegoExpressEngine createEngine(appID, appSign, true, 0).then((e)) {
engine = e;
...
}
}
空平安引入的劣势
这里值得注意的是,咱们的目标并不是为了打消 null
,一个示意空缺的值是十分有用的。在语言中提供对空缺值的反对,能够让解决空缺更为灵便和高效,它为可选参数、?.
空调用语法糖和默认值初始化提供了根底。
所以 null
不是蹩脚的,蹩脚的它会在你意想不到的中央呈现,最终引发问题。而空平安的引入是让代码中 null 变得可见和可控,并且确保它不会传递到某些地位从而引发解体。
当语言对程序中语义化的属性做出硬性保障时,阐明编译器能真正意义上为这些属性作出优化,当它波及到 null
时,意味着能够打消不必要的 null
查看,提供更精悍的代码,并且在对其调用办法前,不须要再校验是否其为空调用。反映在在包体大小和性能晋升方面都带来了可观的成果。
ZEGO Express Flutter SDK 已全面反对空平安
鉴于空平安带来的种种劣势,Express Flutter SDK 在 2.5.1 版本中对空平安曾经进行了全面的反对。
Express Flutter SDK 2.5.1 及后续版本反对 null-safey,作为一个向后兼容的个性,必须应用 Dart 2.12 或更高版本。
Express Flutter SDK 2.5.1 反对 Flutter 2.x (仅限与 Android 和 iOS 平台)。
在 Dart 的包管理文件 pubspec.yaml 中可进行配置:
environment:
sdk: ">=2.12.0 <3.0.0"
flutter: ">=2.0.0"
最初,如果您想深刻了解空平安可参考 Dart 官网文档:https://dart.cn/null-safety/understanding-null-safety
具体理解 Express Flutter 的相干性能请参考 ZEGO 官网文档和示例源码:https://doc-zh.zego.im/article/5424。