天天看點

Flutter 3.7 新特性:介紹背景isolate通道介紹背景 isolate 通道用例快速開始技術細節

Flutter 3.7 釋出,本人對其中背景 isolate 通道比較感興趣,迫不及待翻譯了下Aaron Clarke文章,第一次翻譯,有不足地方歡迎各位大佬們評論區指正,我将持續更新到本文,謝謝。

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

介紹背景 isolate 通道

Flutter 3.7 新特性:介紹背景isolate通道介紹背景 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’));
}
           

技術細節

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

Flutter 3.7 新特性:介紹背景isolate通道介紹背景 isolate 通道用例快速開始技術細節

當平台通道被調用産生結果時将通過寫死轉到 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 社群的支援,我希望你們都能找到這個新特性更驚豔的用途。

如果覺得文章對你有幫助,點贊、收藏、關注、評論,一鍵四連支援,你的支援就是我創作最大的動力。

❤️ 本文原創聽蟬 公衆号:碼裡特别有禅 歡迎關注原創技術文章第一時間推送 ❤️