Flutter 3.7 发布,本人对其中后台 isolate 通道比较感兴趣,迫不及待翻译了下Aaron Clarke文章,第一次翻译,有不足地方欢迎各位大佬们评论区指正,我将持续更新到本文,谢谢。

原文地址:Introducing background isolate channels | by Aaron Clarke | Flutter | Jan, 2023 | Medium

介绍后台 isolate 通道

此时此刻,我很高兴地宣布从 Flutter 3.7 开始开发人员可以在任意 isolate 中使用插件和平台通道了。 这是自 2018 年以来一直存在并且也是我们排名最高的问题之一。它被降低了优先级,因为实现并不容易且已存在解决方案,尽管很麻烦:始终在 root isolate(Flutter 提供的 isolate)中使用插件 . 然而,随着 Flutter 的日益成熟,越来越关注性能,俗话说“让它工作,让它正确,让它快速”。 选择实现这一特征有利于提高性能和易用性。 因此,考虑带来的收益我们决定实现这一特性。

如果您想了解如何使用此特性,请查看 GitHub 上的示例代码(PS: 原文示例代码不可用,这里我用另外一个官方大佬示例代替了。)。

用例

为什么有人想在后台 isolate 中使用插件呢?很明显,因为世上并不是所有代码都是用 Dart 编写的。社区多年来一直致力于使用插件来访问代码(非 Dart 实现),例如 path_provider 找到临时目录的能力或 flutter_local_notifications 发布通知的能力。

另外一个问题是:为什么有人在后台线程中执行代码呢?因为有时您别无选择,库可能正调用后台 isolate 回调,例如 android_alarm_manager_plus。或者某个应用可能正在进行大量计算,而开发人员不希望这些计算影响 UI。

在我帮助谷歌其他团队使用 Flutter 的过程中,随着产品的演进,最终会不可避免地遇到 root isolate 瓶颈。 因此,我们需要确保在框架中优化,并为开发者提供工具使其在必要时做更少的事。

下面是后台 isolate 一个人为的用例:

试想,一个应用程序可通过人工智能根据文本提示生成高分辨率图像。用户之前创作都被存储在 Firebase Cloud 中,需求是用户可以用手机随时分享创作。该 Flutter 应用启动时会开启一个后台 isolate 从 Firebase Cloud Store 下载 8K 文本提示相关图片,将图像压缩至指定规格大小导出,保存到相册,最后导出完成并发送通知。

在此示例中,后台 isolate 至少使用了 3 个插件,一个用于从 Firebase Cloud Storage 中请求数据;接着保存到手机相册,保存完毕发送本地通知告诉用户。如果没有后台通道,该应用不得不在 root isolate 中拷贝 8k 图像到后台 isolate 中进行采样,当前 Dart 版本没法保证拷贝过程时间是不变的。

快速开始

下面是一个使用新 API 在后台 isolate 中调用 shared_preferences 插件的示例:

import 'package:flutter/services.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() {
//root isolate传给后台isolate标志
//(API开始从Flutter3.7)
RootIsolateToken rootIsolateToken = RootIsolateToken.instance!;
Isolate.spawn(_isolateMain, rootIsolateToken);
}void _isolateMain(RootIsolateToken rootIsolateToken) async {
// 将后台isolate注册为root isolate
BackgroundIsolateBinaryMessenger
.ensureInitialized(rootIsolateToken);
//你现在可以用shared_preferences插件了。
SharedPreferences sharedPreferences =
await SharedPreferences.getInstance();
print(sharedPreferences.getBool(‘isDebug’));
}

技术细节

下面是平台通道工作原理概述:

当平台通道被调用产生结果时将通过硬编码转到 platform 线程。为了保证后台 isolate 正常运行,发送消息的 isolate 应该被持有,以便引擎可以在该 isolate 的事件循环上调度结果,这是通过Dart’s ports来实现的,Dart ports 存储并持有 isolate,这也是通过 C Api 调用这些 isolate 的唯一方式。

其他需要实现的功能是将后台 isolate 与 root isolate 关联起来。这是令我惊讶的,为了在引擎销毁时关闭平台通道,我们应该知道与引擎关联的后台 isolate,否则后台 isolate 可能与正在销毁引擎通信,这样做的效果可以在最终的 API 中看到,必须使用 RootIsolateToken 来初始化BackgroundIsolateBinaryMessenger。

有关实现的更多信息,请查看Isolate Platform Channels设计文档。文档中也包含了相左的沟通建议,但尚未付诸实施或接受。

感谢 Flutter 社区的支持,我希望你们都能找到这个新特性更惊艳的用途。

如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。

️ 本文原创听蝉 公众号:码里特别有禅 欢迎关注原创技术文章第一时间推送 ️

Flutter 3.7 新特性:介绍后台isolate通道的更多相关文章

  1. dubbox新特性介绍

    dubbx是当当网对原阿里dubbo2.x的升级,并且兼容原有的dubbox.其中升级了zookeeper和spring版本,并且支持restfull风格的远程调用. dubbox git地址:  h ...

  2. Hadoop3.0新特性介绍,比Spark快10倍的Hadoop3.0新特性

    Hadoop3.0新特性介绍,比Spark快10倍的Hadoop3.0新特性 Apache hadoop 项目组最新消息,hadoop3.x以后将会调整方案架构,将Mapreduce 基于内存+io+ ...

  3. jdk7和8的一些新特性介绍

    jdk7和8的一些新特性介绍 本文是我学习了解了jdk7和jdk8的一些新特性的一些资料,有兴趣的大家可以浏览下下面的内容. 官方文档:http://www.oracle.com/technetwor ...

  4. ArcGIS 10.3 for Desktop新特性介绍

    ArcGIS 10.3是一个完整公布的ArcGIS平台,它包含新的产品(ArcGIS Pro),针对10.2版本号产品进行了功能增强和稳定性的改进. ArcGIS 10.3 for Server新特性 ...

  5. Xcode9新特性介绍-中文篇

    背景: Xcode 9 新特性介绍: 1.官方原文介绍链接 2.Xcode9 be ta 2 官方下载链接 本文为官方介绍翻译而来,布局排版等都是按照官方布局来的. 与原文相比,排版上基本还是熟悉的配 ...

  6. php7函数,声明,返回值等新特性介绍

    使用 ... 运算符定义变长参数函数 (PHP 5 >= 5.6.0, PHP 7) 现在可以不依赖 func_get_args(), 使用 ... 运算符 来实现 变长参数函数. functi ...

  7. webpack 4.0.0-beta.0 新特性介绍

    webpack 可以看做是模块打包机.它做的事情是:分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其打包为合适的格式 ...

  8. MyBatis 3.5.2 新特性介绍

    1.MyBatis 最新版本 3.5.2 发布 MyBatis最新版本是:3.5.2,发布时间是:2019年7月15日 2.MyBatis 3.5.2 新特征介绍 我们知道,MyBatis 是支持定制 ...

  9. Java 11 新特性介绍

    Java 11 已于 2018 年 9 月 25 日正式发布,之前在Java 10 新特性介绍中介绍过,为了加快的版本迭代.跟进社区反馈,Java 的版本发布周期调整为每六个月一次——即每半年发布一个 ...

  10. Pivotal Greenplum 6.0 新特性介绍

    Pivotal Greenplum 6.0 新特性介绍   在1月12日举办的Greenplum开源有道智数未来技术研讨会上,Pivotal中国研发中心Greenplum 产品经理李阳向大家介绍了Pi ...

随机推荐

  1. 二十九、Helm常用命令

    # 创建一个chart范例 helm create HELM-NAME # 检查chart语法 helm lint ./HELM-NAME # 使用默认chart部署到k8s helm install ...

  2. 蓝桥杯赛前复习C++

    C标准库常用函数 memset函数:暴力清空 void *memset(void *str, int c, size_t n) str -- 指向要填充的内存块. c -- 要被设置的值.该值以 in ...

  3. Python学习之实例3

    一.文字读取并打印拼接字符串 1 with open('G:\python\char.txt') as f: #使用open()函数以只读模式打开文件 2 s=f.read() #使用read()方法 ...

  4. 思维分析逻辑 3 DAY

    目录 指标分析 指标选择原则 指标体系建立 步骤 流量分析 渠道分析(从哪来) 常见渠道及渠道分类 渠道推广过程 渠道的指标 渠道分析方法 转化及价值分析(经过什么?产生什么价值?) 漏斗分析 功能模 ...

  5. nginx配置https后,网站出现无法访问情况

    证书来自阿里云. Nginx配置如下 server { listen 443; server_name package.oeynet.com; root /server/wwwroot/package ...

  6. 配置MSTP功能示例

    组网需求 在一个复杂的网络中,网络规划者由于冗余备份的需要,一般都倾向于在设备之间部署多条物理链路,其中一条作主用链路,其他链路作备份.这样就难免会形成环形网络,若网络中存在环路,可能会引起广播风暴和 ...

  7. (GCC) C++代码中使用#pragma GCC optimize / #pragma G++ optimize

    科学计算用优化 经过实验证明这个命令优化效果最好,把我的 1.2S 的 FFT 优化到了 0.4S使用 pragma 命令优化程序: #pragma GCC optimize("Ofast, ...

  8. c# 使用委托子窗体改变父窗体控件

    首先创建两个窗体,在窗体1和窗体2放上对应的控件 在窗体1的代码如下 using System; using System.Collections.Generic; using System.Comp ...

  9. layui文件上传

    //前端代码 <div class="layui-form-item"> <label class="layui-form-label"> ...

  10. day11 枚举类enum & 单例模式 & 异常以及抛出

    day11 枚举enum 用enum关键字定义枚举类 特点 1.用enum关键字定义枚举类 2.枚举类默认继承java.lang.Enum类 3.枚举类的构造方法只能使用private修饰,省略则默认 ...