首页 > 其他分享 >Flutter 3.7 新特性:介绍后台isolate通道

Flutter 3.7 新特性:介绍后台isolate通道

时间:2023-01-30 18:37:33浏览次数:58  
标签:插件 示例 isolate 3.7 后台 root Flutter

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

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

介绍后台 isolate 通道

/i/l/?n=23&i=other/3070683/202301/3070683-20230130181811140-1554464013.webp

此时此刻,我很高兴地宣布从 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’));
}

技术细节

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

https://miro.medium.com/max/720/0*Db7Niu7FqKGszecZ

当平台通道被调用产生结果时将通过硬编码转到 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 社区的支持,我希望你们都能找到这个新特性更惊艳的用途。

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

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

标签:插件,示例,isolate,3.7,后台,root,Flutter
From: https://www.cnblogs.com/xuge2it/p/17076926.html

相关文章

  • Flutter:升级用到的第三方库(Flutter 3.7.0)
    一,查看当前项目webview_flutter的版本:我们需要对webview_flutter这个第三方库升级说明:pubspec.yaml  声明依赖哪些包的配置文件,可以手动配置pubspec.lock  统一......
  • flutter Listview physics常见子类
    ListView的physics是ScrollPhysics类:其常见子类有BouncingScrollPhysics :允许滚动超出边界,但之后内容会反弹回来。ClampingScrollPhysics :防止滚动超出边界,夹住 。......
  • flutter Container 在Expanded会占用尽可能大的区域
    布局特点一、Container在不设置宽高的情况下,它的size取决于如果设置了child,那么它会尽可能小,在没有设置constraints情况下,相当于child的大小。如果没有设置child,那么它......
  • 1.2 初识 Flutter
    1.2.1Flutter简介Flutter是Google推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过Dart语言开发App,一套代码同时运行在iOS和Android......
  • flutter 常用命令
    相关项目操作查看Flutter版本查看当前版本flutter--version查看所有版本flutterversion打印所有命令行用法信息 flutter-h或者flutter......
  • flutter:设置当前的channel并更新版本(从master切换到stable)
    一,查看当前flutter和dart的版本:说明:我们当前的channel是master,所以可以看到flutter和dart版本均为pre或dev版本:liuhongdi@liuhongdideMacBook-Pro~%flutter--ve......
  • Flutter实战-第二版
    第二版序本书是Flutter中国开源项目 (opensnewwindow)发起人杜文(网名wendux)创作的一本系统介绍Flutter技术的中文书籍,旨在帮助开发者系统地、循序渐进地了解Flutter......
  • MAC M1芯片架构问题 Flutter 项目里用的flutter_blue库比较老,导致报该错误
    1. flutter_blue里面修改配置https://www.jianshu.com/p/b450a5589b33 不要直接打开Flutter项目,用AndroidStudio打开项目里的android目录,  由于我的项目......
  • Mac搭建Flutter环境
    1.终端输入命令:vi.bash_profile2.复制:exportPATH="$PATH:/Users/dy/Desktop/flutter/bin:$PATH"exportPUB_HOSTED_URL=https://pub.flutter-io.cnexportFLUTTER_S......
  • macOS 上安装和配置 Flutter 开发环境
    本文基于此:Flutter中文网一、安装和运行Flutter的系统环境要求想要安装并运行Flutter,你的开发环境需要最低满足以下要求:操作系统:macOS磁盘空间:2.8GB(不包括IDE/......