即构音视频 Express Flutter SDK 全面支持空安全
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 全面支持空安全的更多相关文章
- moviepy音视频剪辑:TextClip不支持中文字符以及OSError: magick.exe: unable to read font 仿宋_GB2312.ttf的解决办法
☞ ░ 前往老猿Python博文目录 ░ 一.引言 moviepy对中文和多语言环境的支持做得并不好,包括中文文件名以及用于显示文字的TextClip就是典型的中文支持方面存在问题的.对于编解码的问题 ...
- Flutter SDK path为空导致工程打开后不显示iOS模拟器的问题
说明下问题场景,面向git编程时下载了个开源的Flutter项目 Mac系统下AndroidStudio打开工程后,发现顶部不展示iPhone模拟器 根据ide浅黄色提示提示,判断是FlutterSD ...
- 从零到一,使用实时音视频 SDK 一起开发一款 Zoom 吧
zoom(zoom.us) 是一款受到广泛使用的在线会议软件.相信各位一定在办公.会议.聊天等各种场景下体验或者使用过,作为一款成熟的商业软件,zoom 提供了稳定的实时音视频通话质量,以及白板.聊天 ...
- 融云携新版实时音视频亮相 LiveVideoStack 2019
4 月 19 日,LiveVideoStack 2019 音视频大会在上海隆重开幕,全球多媒体创新专家.音视频技术工程师.产品负责人.高端行业用户等共襄盛会,聚焦音频.视频.图像.AI 等技术的最新探 ...
- 音视频通讯QoS技术及其演进
利用多种算法和策略进行网络传输控制,最大限度满足弱网场景下的音视频用户体验. 良逸|技术作者 01 什么是QoS?音视频通讯QoS是哪一类? QoS(Quality of Service)是服务质量的 ...
- moviepy音视频开发:使用credits1给视频加片头片尾字幕
☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:视频基类VideoClip子类DataVideoClip.UpdatedVideoClip.ImageClip. ...
- PyQt+moviepy音视频剪辑实战文章目录
☞ ░ 前往老猿Python博文目录 ░ 本专栏为moviepy音视频剪辑合成相关内容介绍的免费专栏,对应的收费专栏为<moviepy音视频开发专栏>. 一.moviepy基础能力系统介绍 ...
- ffmpeg实战-音视频基础概念
转发自白狼栈:查看原文 关于音视频,相信大家都看过电影(视频),听过音乐(音频),至少应该都知道mp4是视频文件,mp3是音频文件. 对于一个音视频文件,都有哪些属性呢?以视频为例,我们可以通过 ff ...
- Capstone通用 USB Type-C音视频拓展坞转换芯片
专业解决视频接口技术Capstone科技在2021年新推出四款低功耗单芯片USB Type-C音视频格式转换器方案──CS5266.CS5267.CS5268与CS5269.将为各种显示屏.外部显示设 ...
- 如何基于 ZEGO SDK 实现 Flutter 一对一音视频聊天应用?
之前的文章发布了ZEGO SDK实现Android端音视频通话应用的开发教程,不少开发者反馈很实用,能不能也出一版Flutter的教程. 有求必应,这不小编来了- 我们封装了ZEGO Flutter ...
随机推荐
- Django日期字段默认值default=timezone.now
如果你确实希望默认值是当前日期和时间,Django 提供了一个方便的函数 django.utils.timezone.now 来实现这一目的. 你可以这样调整你的模型,以使用当前日期和时间作为默认值: ...
- 玄机-第二章日志分析-mysql应急响应
目录 前言 简介 应急开始 准备工作 日志分析 步骤 1 步骤 2 步骤 3 步骤 4 总结 补充mysql中的/var/log/mysql/erro.log 记录上传文件信息的原因 前言 这里应急需 ...
- 使用 `useServerSeoMeta` 优化您的网站 SEO
title: 使用 useServerSeoMeta 优化您的网站 SEO date: 2024/7/31 updated: 2024/7/31 author: cmdragon excerpt: 摘 ...
- 【SpringCloud】Nacos集群部署(Centos平台)
一.前提环境准备 Nacos 下载 https://github.com/alibaba/nacos/releases 或者使用其它博主备份的 https://blog.csdn.net/weixin ...
- 【Git】05 分支管理
查看所有分支: git branch Git将列出所有分支,如果是当前使用的分支,前面会加一个星号表示 创建一个新的分支: git branch 分支名称 创建一个分支并且指向该分支: git che ...
- Parallel and Sequential Data Structures and Algorithms
并串行 从零开始考前突击并串行数据结构与算法 强烈建议和原教材参照着看 Introduction 本书的要点 定义问题 不同的算法解决 设计抽象数据类型和相应的数据结构实现 分析比较算法和数据类型的代 ...
- 从.net开发做到云原生运维(七)——服务网格Istio
1. 前言 上篇文章我们讲了dapr,dapr作为开发阶段使用的组件,需要开发人员知道怎么使用,到此篇文章之前,开发人员的开发任务已经完成了,剩下的就是一些运维相关的事情了.假设我们的服务已经开发完成 ...
- Google的TPU的向量化内存的读取规格——单次读取/写入的数据量
异构加速设备: GPU.TPU.NPU 这几种设备,除了GPU公开了部分硬件设计原理和软件编程范式以外,所有的TPU和NPU的资料都是不公开的,都是被其所属公司保留的,然后这些公司会自己在这些硬件之上 ...
- Jax的加速层的伪代码/中间层代码的生成和查看
地址: https://jax.readthedocs.io/en/latest/notebooks/thinking_in_jax.html#jit-mechanics-tracing-and-st ...
- 标准DQN在测试算法性能时为什么要将探索概率epsilon设置为0.05呢,而不是使用其他探索概率的epsilon-greedy策略或者直接使用greedy探索策略呢?
标准dqn的策略网络参数更新所采用的规则为Q-learning中的更新规则,总所周知的是Q-learning是异策略算法,异策略算法就是行为策略和评估策略(更新所得策略)是不同的. 更新规则: q-l ...