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 社區的支持,我希望你們都能找到這個新特性更驚艷的用途,
如果覺得文章對你有幫助,點贊、收藏、關注、評論,一鍵四連支持,你的支持就是我創作最大的動力,
?? 本文原創聽蟬 公眾號:碼里特別有禪 歡迎關注原創技術文章第一時間推送 ??
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/542655.html
標籤:其他
