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

在这里插入图片描述

Logo

致力于链接即构和开发者,提供实时互动和元宇宙领域的前沿洞察、技术分享和丰富的开发者活动,共建实时互动世界。

更多推荐