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

即构音视频 Express Flutter SDK 全面支持空安全的更多相关文章

  1. moviepy音视频剪辑:TextClip不支持中文字符以及OSError: magick.exe: unable to read font 仿宋_GB2312.ttf的解决办法

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 moviepy对中文和多语言环境的支持做得并不好,包括中文文件名以及用于显示文字的TextClip就是典型的中文支持方面存在问题的.对于编解码的问题 ...

  2. Flutter SDK path为空导致工程打开后不显示iOS模拟器的问题

    说明下问题场景,面向git编程时下载了个开源的Flutter项目 Mac系统下AndroidStudio打开工程后,发现顶部不展示iPhone模拟器 根据ide浅黄色提示提示,判断是FlutterSD ...

  3. 从零到一,使用实时音视频 SDK 一起开发一款 Zoom 吧

    zoom(zoom.us) 是一款受到广泛使用的在线会议软件.相信各位一定在办公.会议.聊天等各种场景下体验或者使用过,作为一款成熟的商业软件,zoom 提供了稳定的实时音视频通话质量,以及白板.聊天 ...

  4. 融云携新版实时音视频亮相 LiveVideoStack 2019

    4 月 19 日,LiveVideoStack 2019 音视频大会在上海隆重开幕,全球多媒体创新专家.音视频技术工程师.产品负责人.高端行业用户等共襄盛会,聚焦音频.视频.图像.AI 等技术的最新探 ...

  5. 音视频通讯QoS技术及其演进

    利用多种算法和策略进行网络传输控制,最大限度满足弱网场景下的音视频用户体验. 良逸|技术作者 01 什么是QoS?音视频通讯QoS是哪一类? QoS(Quality of Service)是服务质量的 ...

  6. moviepy音视频开发:使用credits1给视频加片头片尾字幕

    ☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:视频基类VideoClip子类DataVideoClip.UpdatedVideoClip.ImageClip. ...

  7. PyQt+moviepy音视频剪辑实战文章目录

    ☞ ░ 前往老猿Python博文目录 ░ 本专栏为moviepy音视频剪辑合成相关内容介绍的免费专栏,对应的收费专栏为<moviepy音视频开发专栏>. 一.moviepy基础能力系统介绍 ...

  8. ffmpeg实战-音视频基础概念

    转发自白狼栈:查看原文 关于音视频,相信大家都看过电影(视频),听过音乐(音频),至少应该都知道mp4是视频文件,mp3是音频文件. 对于一个音视频文件,都有哪些属性呢?以视频为例,我们可以通过 ff ...

  9. Capstone通用 USB Type-C音视频拓展坞转换芯片

    专业解决视频接口技术Capstone科技在2021年新推出四款低功耗单芯片USB Type-C音视频格式转换器方案──CS5266.CS5267.CS5268与CS5269.将为各种显示屏.外部显示设 ...

  10. 如何基于 ZEGO SDK 实现 Flutter 一对一音视频聊天应用?

    之前的文章发布了ZEGO SDK实现Android端音视频通话应用的开发教程,不少开发者反馈很实用,能不能也出一版Flutter的教程. 有求必应,这不小编来了- 我们封装了ZEGO Flutter ...

随机推荐

  1. PowerBuilder编程新思维10.5:外传2(PowerPlume下一代开发解决方案)

    万里归来年愈少 PB编程新思维10.5:外传2(PowerPlume下一代解决方案) 前言 今天我们就来盘点一下,PB下一代开发的所有技术可能性.所谓下一代开发技术,就是指脱离或半脱离PBVM的应用开 ...

  2. Swift开发基础01-语法

    Hello World print("Hello World") 不用编写main函数,Swift将全局范围内的首句可执行代码作为程序入口一句代码尾部可以省略分号(;),多句代码写 ...

  3. 微信小程序热门选题

    一.大体实现思路 微信小程序,现在是非常热门的,基于微信生态开发的.现在很多计算机毕业的同学,都会选择微信小程序作为毕业设计 小程序端通常都是展示数据给用户去看的,大多数情况下,这些数据不是写死的,而 ...

  4. [oeasy]python0010_怎么用命令行保存文件

    编写 py 文件 回忆上次内容 上次 真的输出了 程序员的浪漫 Hello world!   print函数 可以输出 字符串 但是 print这个词 别拼错 就连 大小写 也别能错 错了就改 也没事 ...

  5. CCF 任务调度

    样例的示意图 查了一圈,然后很烦,不想学习方法,好卡.查了一些题解,发现都是10分,30分先搁置的博客,最后翻到 堪称官方标称的思路 (CCF题目pat题目各大poj/hdoj好戏那个都没有标程,这里 ...

  6. Git的存储原理

    目录 Git 设计原理 Git vs SVN Git 存储模型 .git 目录结构 Git 基本数据对象 Git 包文件 Git 引用 Git 设计原理 概括的讲,Git 就是一个基于快照的内容寻址文 ...

  7. Jmeter的安装(Windows)

    1.选择和本机JDK兼容的jmeter版本下载 Jmeter历史版本下载地址:https://archive.apache.org/dist/jmeter/binaries/ 此处我的jmeter5. ...

  8. 7、SpringBoot2之整合事务及AOP

    本文在SpringBoot2之整合Mybatis的基础上进行 7.1.整合事务 7.1.1.mapper接口 int deleteEmployeeById(int id); 7.1.2.mapper映 ...

  9. 使用 Alba 对 AspnetCore项目进行测试

    前言 在AspnetCore生态系统中,我们测试项目一般使用Microsoft.AspNetCore.TestHost的TestServer 到.NET6后提供的Microsoft.AspNetCor ...

  10. 【转载】 python之理解super及MRO列表

    原文地址:   https://www.jianshu.com/p/de7d38c84443 ----------------------------------------------------- ...