关于flutter:Flutter-37-新特性介绍后台isolate通道

3次阅读

共计 2324 个字符,预计需要花费 6 分钟才能阅读完成。

Flutter 3.7 公布,自己对其中后盾 isolate 通道比拟感兴趣,急不可待翻译了下 Aaron Clarke 的文章,第一次翻译,有有余中央欢送各位大佬们评论区斧正,我将继续更新到本文,谢谢。

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

此时此刻,我很快乐地发表从 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 社区的反对,我心愿你们都能找到这个新个性更惊艳的用处。

如果感觉文章对你有帮忙,点赞、珍藏、关注、评论,一键四连反对,你的反对就是我创作最大的能源。

❤️ 本文原创 听蝉 公众号: 码里特地有禅 欢送关注原创技术文章第一工夫推送 ❤️

正文完
 0