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. iphoneApp Fidder设置

    使用iphone 打开fidder 按照如上配置 安装完毕 然后访问计算机地址- 比如我的计算机ip地址是 192.168.2.10那么我需要在我的safari浏览器中输入192.168.2.10:8 ...

  2. 强连通分量与tarjan算法初步运用

    模板题:B3609 [图论与代数结构 701] 强连通分量 题目描述 给定一张 n 个点 m 条边的有向图,求出其所有的强连通分量. 注意,本题可能存在重边和自环. 输入格式 第一行两个正整数 n , ...

  3. day17-Servlet06

    Servlet06 15.HttpServletResponse 15.1HttpServletResponse介绍 每次HTTP请求,Tomcat都会创建一个HttpServletResponse对 ...

  4. Go语言核心36讲37

    你好,我是郝林,今天我们继续来分享并发安全字典sync.Map的内容. 我们在上一篇文章中谈到了,由于并发安全字典提供的方法涉及的键和值的类型都是interface{},所以我们在调用这些方法的时候, ...

  5. 关于虚拟机使用桥接网络访问不到物理机IP的问题解决

    问题描述 物理机可以ping 到虚拟机IP,虚拟机 ping 不到物理机IP 解决方法 关闭物理机防火墙,重启虚拟机

  6. py周结04

    py周结04 异常类型,理语法结构及实践案例 1.异常类型 SyntaxError 语法错误 NameError 名字错误 IndexError 指数错误 KeyError 关键字错误 Indenta ...

  7. Linux 中的文件简单说明

    Linux 中的文件简单说明 作者:Grey 原文地址: 博客园:Linux 中的文件简单说明 CSDN:Linux 中的文件简单说明 说明 本文基于 CentOS 7 根目录(/)下文件夹主要作用 ...

  8. 【Shell案例】【wc记录单词长度、for循环和if、awk文本分析工具】7、打印字母数小于8的单词

    描述写一个 bash脚本以统计一个文本文件 nowcoder.txt中字母数小于8的单词. 示例:假设 nowcoder.txt 内容如下:how they are implemented and a ...

  9. 18V降压3.3V,15V降压3.3V的降压IC和LDO芯片方案

    在 18V 和 15V 输入中,我们需要给其他电源电路提高供电,有的电路的供电电压在 5V,或者是 3.3V 时, 我们就需要使用降压芯片来组建一个降压电路来给后面的的电路,提供稳定的,持续的 3.3 ...

  10. 三道MISC的writeup

    (1)背时 描述:腐烂了,变异了,太背时了...... 附件为一个压缩包 解题思路: 1.打开压缩包,发现有一个描述:v(51wA:I7uABi#Bx(T 2.将v(51wA:I7uABi#Bx(T进 ...