0%

【文章翻譯】What’s new in Flutter 3.22

【文章內容使用 Gemini 1.5 Pro 自動產生】

宣布 Flutter 3.22:WebAssembly、圖形渲染增強功能和更多 AI 整合選項

歡迎回來,一起迎接另一個令人興奮的 Flutter 穩定版本!這次,我們很高興推出 Flutter 3.22。我們將 WebAssembly 帶到穩定通道,為 Android 上的 Impeller 提供功能齊全的 Vulkan 後端,有望帶來更流暢的圖形和大幅提升效能。我們還推出了精簡的工作流程,其中包含新的 Widget 狀態屬性、動態視圖大小調整和改進的表單驗證功能。但這還不是全部——您將發現風味條件的資產捆綁、Firebase 上 Vertex AI 的預覽版本(使用 Dart),以及更新的 DevTools,讓您的生活更輕鬆。

自上次更新以來,僅僅幾個月,我們就從 Flutter 社群合併了令人印象深刻的 1595 個拉取請求,其中有 37 位新社群成員首次為 Flutter 貢獻!

因此,深入了解 Flutter 社群帶給這個最新版本的最新功能和增強功能吧!

WebAssembly

隨著 Flutter 3.22 的發佈,Wasm 現在可以在穩定通道上使用,提供顯著的效能提升。在我們在 M1 MacBook 上使用 Chrome 進行的內部基準測試中,Wonderous 應用程式的畫面渲染時間平均提高了 2 倍,在最壞的情況下提高了 3 倍。

這些增強功能對於具有動畫和豐富轉場的應用程式至關重要,在這些應用程式中,保持流暢的畫面速率至關重要。Wasm 透過減少效能瓶頸來幫助實現這一點,從而帶來更流暢的動畫和轉場。若要開始在您的 Flutter 網頁應用程式中使用 Wasm,請查看我們的 Dart Wasm 文件Flutter Wasm 文件。如需完整的公告,請訪問 Google I/O 部落格文章中的 Flutter

引擎

Flutter 3.22 為 Impeller 引入了重大更新,Impeller 是驅動 Flutter 應用程式的渲染引擎。主要亮點包括完成 Android 上的 Vulkan 後端,以實現更流暢的圖形和改進的效能,為模糊效果和複雜路徑渲染進行持續優化,以及一個新的實驗性 API,用於使用 Impeller 進行測試。根據我們的路線圖,我們致力於提升 Impeller 的品質和效能,包括完成 iOS 到 Impeller 的遷移和擴展 Android 支援。

Impeller

Android 上的 Vulkan 後端功能完整

在此版本中,Impeller 的 Android Vulkan 後端已具備完整的功能。特別是在過去的幾個月裡,團隊一直在努力完成 快速進階混合 的實作,支援使用 FragmentProgram API 的自訂片段著色器,PlatformView 支援(儘管它需要 少量 API 遷移),以及完全實作 所有模糊樣式

Android 預覽

在 3.19 穩定版本中,在發佈 Impeller 的 OpenGL 後端的改進之後,我們邀請使用者在支援和不支援 Vulkan 的 Android 設備上試用 Impeller。在過去的幾個月裡,在評估 OpenGL 後端的效能並估計 Vulkan 後端的剩餘工作量之後,我們決定將精力集中在首先讓 Vulkan 後端做好生產準備。

Impeller 解決了著色器編譯卡頓的問題。此外,在我們的基準測試中,它在平均值、第 90 個百分位數和第 99 個百分位數的畫面時間方面優於傳統渲染器。因此,我們認為 Vulkan 後端在 Android 上的效能是可以接受的。在此版本(3.22)中,選擇加入 Impeller 的應用程式將在有 Vulkan 支援的地方使用 Vulkan 後端。在將來的版本中,這將成為預設值。當選擇加入 Impeller 的應用程式在不支援 Vulkan 的設備上運行時,Flutter 將會自動無縫切換為使用 OpenGL ES 和 Skia。您無需採取任何措施。在未來,當我們認為 OpenGL ES Impeller 後端已做好生產準備時,這種回退也會使用 Impeller。

隨著 Android 上的 Impeller 預覽繼續在 3.22 穩定版本週期中進行,我們請求 Flutter 開發人員升級到最新的穩定版本,並在 啟用 Impeller 時提交有關任何發現的不足的錯誤。在此階段的回饋對確保 Impeller 在 Android 上取得成功以及我們能夠在今年晚些時候的版本中自信地將其設為預設渲染器至關重要。Android 硬體生態系統非常多元。因此,關於 Impeller 最有用的回饋應包括有關發生問題的特定設備和 Android 版本的詳細資訊。

模糊效能改進

模糊已在 iOS 和 Android 上的 Impeller 中 重新實作。特別是,這種新方法類似於 Skia 的方法,在 基準測試 中將模糊的 CPU 和 GPU 時間減少了近一半。

下圖顯示了在 iPhone 11 設備上進行的病態基準測試中的最壞情況、第 99 個百分位數、第 90 個百分位數和平均畫面柵格化時間以及 GPU 畫面時間(以毫秒為單位),旨在突出顯示模糊效能。在重寫 Impeller 的模糊之後,背景濾鏡模糊的 CPU 和 GPU 成本都幾乎減少了一半。這種改進的規模也適用於非病態情況,正如典型應用程式中所出現的那樣。

在 iPhone 11 設備上進行的病態基準測試中的第 99 個百分位數、第 90 個百分位數和平均畫面柵格化時間以及 GPU 畫面時間(以毫秒為單位),旨在突出顯示模糊效能

Stencil-then-Cover

iOS 和 Android 上的 Impeller 都已 轉移到新的渲染策略,該策略基於 OpenGL Redbook 中“使用模板緩衝區繪製填充的凹多邊形”章節中描述的 Stencil-then-Cover 方法。團隊成員在 GitHub 問題 #123671 中討論了這種技術在 Flutter 中的應用。

這種方法解決了柵格執行緒在 CPU 上為複雜路徑(例如,SVG 和 Lottie 動畫)計算細分時花費過多時間的問題。更改之後,包含複雜路徑的畫面的總畫面時間(CPU 上的 UI 執行緒 + CPU 上的柵格執行緒 + GPU 工作)要低得多。使用者會注意到 Lottie 動畫和其他複雜路徑渲染得更加流暢,CPU 利用率更低,而 GPU 利用率略微更高。

(左) Lottie 動畫。以前,Impeller 在最近的 iPhone 上需要 64ms/畫面 的柵格執行緒 CPU 時間才能渲染它。(右) 在我們實施 Stencil-then-Cover 優化之後,在相同設備上渲染的相同動畫。柵格時間幾乎快了 10 倍。

雖然對這些改進感到滿意,但我們還有更多工作要做。除了其他機會之外,我們意識到折線生成在 CPU 配置檔案中仍然很突出,我們打算調查將此工作也轉移到 GPU 上。

新的 API

雖然仍處於實驗階段,但 flutter test 現在接受 --enable-impeller 標誌,它使用 Vulkan 後端來執行 Impeller。

架構

Widget 狀態屬性

MaterialState 已被移動到 Material 函式庫之外,並被重新命名為 WidgetState,以便於 Cupertino、基本 Flutter 框架和套件作者使用。如需有關遷移到新的 WidgetState 的更多資訊,請查看 遷移指南

動態視圖大小調整

對動態視圖大小調整的 增強功能 有利於構建響應式佈局的開發人員,確保在各種設備螢幕上具有更好的 UI 自適應性。

改進的表單驗證

感謝 Flutter 社群成員 SharbelOkzan貢獻,Flutter 3.22 帶來了更靈活的表單驗證方法,使開發人員能夠建立更健壯的使用者輸入處理,從而提升可用性和安全性。

2D API 中的協變

減少在 2D 圖形 API 中進行類型轉換的需要,簡化了開發工作流程並提高了效能,這對於遊戲和複雜動畫非常重要。

風味條件的資產捆綁

使用 風味 功能的開發人員現在可以將個別資產配置為僅在為特定風味構建時進行捆綁。如需更多資訊,請查看 根據風味有條件地捆綁資產

使用 Dart 套件變換資產

使用者現在可以將 Dart 套件配置為在捆綁時變換應用程式的資產。如需更多資訊,請查看 在構建時變換資產

Android

深度連結

深度連結可以顯著提高 Flutter 應用程式中的使用者體驗,充當將使用者無縫引導到應用程式中特定內容的捷徑,從而提升參與度和推動銷售。雖然 iOS 的通用連結和 Android 的應用程式連結因其安全性及其使用者友好的特性而受到高度推薦,但設定它們可能有點棘手。

在上次 Flutter 穩定版本中,我們在 DevTools 中引入了一個深度連結驗證工具,該工具支援為 Android 應用程式檢查網頁配置。在此版本中,我們添加了一組新的功能來幫助驗證 Android 清單檔案中的設定。

如需有關使用此工具的更多資訊,請查看 驗證深度連結

預測返回手勢

Flutter 現在為 Android 的即將推出的預測返回功能提供了更多支援,使用者可以在返回手勢期間預覽上一個路由,甚至預覽上一個應用程式。這仍然是 Android 設備上的功能標誌,但您可以在 GitHub 上找到有關如何自行嘗試它的詳細資訊。

Flutter 工具強制執行 Gradle、AGP、Java 和 Kotlin 上的版本要求

在此版本中,Flutter 工具強制執行有關它支援的 Gradle、Android Gradle Plugin (AGP)、Java 和 Kotlin 版本的策略。最初,該工具只提供警告。

目前,支援的版本範圍如下:

  • Gradle - 完全支援 7.0.2 到最新版本,否則警告
  • AGP - 完全支援 7.0.0 到最新版本,否則警告
  • Java - 完全支援 Java 11 到最新版本,否則警告
  • Kotlin - 完全支援 1.5.0 到最新版本,否則警告

在下次主要版本更新中,這些警告將變為錯誤,可以使用 --android-skip-build-dependency-validation 標誌覆蓋。更一般而言,該工具會在完全放棄對這些相依項目的給定版本的支援(生成錯誤)之前,至少提供一個版本的警告。

這項策略在 相關的設計規範 中有討論。歡迎隨時發表意見和回饋。

支援在 Android 上的 Gradle 組建指令碼中使用 Gradle Kotlin DSL

Gradle Kotlin DSL 現在在 Flutter 中得到支援,為傳統的 Gradle Groovy DSL 提供了一個替代方案。這種支援允許提供更好的程式碼編輯體驗,其中包含自動完成、快速存取文件、原始碼導航以及上下文感知重構。

此初始支援由 GitHub 使用者 bartekpacia 貢獻。開發人員現在可以选择使用 Kotlin 重寫他們的 Gradle 組建指令碼,以利用這些優點,儘管 Flutter 工具目前還不允許在使用 flutter create 時選擇 Kotlin 而不是 Groovy。

如需更多詳細資訊,請查看 bartekpaciaPR 140744

平台視圖改進

給所有 Flutter 應用程式開發人員的提醒!如果您使用 Flutter 構建依賴原生 Android 組件(如地圖、網頁視圖或某些 UI 元素)的應用程式,我們有一些重要資訊。

由於 Android 14 中的一個錯誤,使用舊版 Flutter 構建的應用程式可能無法在運行此新 Android 版本的設備上正常工作。

Flutter 3.22 修複了這個問題,並改進了 Android 應用程式中這些原生組件的整體效能。因此,為了確保您的應用程式在所有 Android 設備上順暢運行,請確保使用 Flutter 3.22 重新構建和發佈您的應用程式。

此更新還包括幕後改進,以使 Android 上的平台視圖更加可靠和高效。

KitKat 支援結束

Flutter 的最低支援 Android 版本現在是 Lollipop (API 21)。從 Flutter 的 3.22 穩定版本開始,Flutter 將不再在運行 Android KitKat (API 19) 的設備上工作。如需更多詳細資訊,請查看我們的 棄用指南

iOS

平台視圖效能

我們理解 iOS 上的平台視圖效能一直是許多 Flutter 開發人員的痛點。這在使用平台視圖時,特別是在捲軸視圖中很明顯。

最近的更新直接解決了這些問題,在嵌入文章中的多個內聯廣告等場景中取得了顯著的改進。以下是一些 基準測試 中的一些關鍵改進:

  • 降低 GPU 使用率: GPU 使用率降低了 50%,從而減少了功耗,並可能帶來更流暢的使用者體驗。
  • 改進畫面渲染: 平均畫面渲染時間減少了 1.66ms(33%)。
  • 最小化卡頓: 最壞情況下的畫面渲染時間減少了 3.8ms(21%)。

如果您以前在捲軸視圖中使用多個平台視圖(如廣告、地圖等)時遇到效能挑戰,這些優化可能有助於提供更流暢、響應更靈敏的捲軸體驗。請試用一下,並告訴我們您的想法。

生態系統

Vertex AI for Firebase Dart SDK 預覽版本發佈

Vertex AI for Firebase 產品已發佈到公開預覽版,其中包含 Dart SDK。這使您可以使用 Gemini API 為您的 Dart 或 Flutter 應用程式構建生成式 AI 功能,並考慮到生產、效能和企業規模。該 SDK 集成了 Firebase 應用程式檢查,這可以保護您的 API 調用,並保護您的後端基礎設施免受嚴重的威脅,例如計費欺詐、釣魚和應用程式偽裝。跳入 Dart 入門,並使用促銷代碼免費開始使用。

Google AI Dart SDK 仍然可用,建議僅用於原型設計。Google AI 具有免費使用權限(在限制範圍內,以及在有提供的地方),並提供按使用付費定價。如果您一直在使用 Google AI Dart SDK 進行原型設計,並且已準備好遷移到 Firebase 上的 Vertex AI,請查看 遷移指南

DevTools 更新

我們繼續改進 DevTools,這是 Dart 和 Flutter 的效能和除錯工具套件。此版本包含效能改進、通用潤色以及新的功能,例如在時間軸中包含 CPU 樣本、進階過濾以及支援匯入和匯出記憶體快照。

其他值得注意的改進與 devtools_extensions 和 devtools_app_shared 套件一起發佈,這些套件支援 DevTools 擴展作者。我們添加了對將擴展連接到新的 Dart Tooling Daemon (DTD) 的支援,這使 DevTools 擴展可以存取由其他 DTD 客戶端(例如 IDE)註冊的公開方法,以及允許存取用於與開發專案進行互動的最小檔案系統 API。

若要進一步了解 Flutter 3.22 中包含的所有更新,請查看 DevTools 的發行備註 2.32.02.33.02.34.1

Flutter 的 Google 行動廣告 SDK

對於那些使用廣告為 Flutter 應用程式獲利的人來說,我們有一些好消息:Flutter 的 Google 行動廣告剛剛發佈了 5.0.1 版本的重大更新!

增強對使用者訊息平台 (UMP) SDK 的支援: 此更新添加了對 Android UMP SDK 版本 2.2.0 和 iOS UMP SDK 版本 2.4.0 中的最新 API 的支援。UMP SDK 對遵守隱私法規至關重要,讓您更容易獲得使用者對個人化廣告的同意。此新版本引入了幾個新的 API,以簡化同意收集過程。

擴展的中介合作夥伴: 我們透過提供與熱門廣告合作夥伴的整合,擴展了您的廣告變現範圍,這些合作夥伴包括 UnityMetaAppLovinIron SourceMintegralPangleDT ExchangeInMobi 以及 Liftoff。您現在可以使用擴展的中介選項和簡化的實作,最大限度地提高應用程式的收入。

我們鼓勵您在 Flutter 應用程式中試用這些新功能,並告訴我們您希望我們支援哪些其他中介合作夥伴。您的回饋對我們持續改進 Flutter 的 Google 行動廣告 SDK 至關重要。

重大變更和棄用

移除 v1 Android 嵌入

版本一 Android 嵌入的刪除正在進行中。這可能對大多數應用程式沒有影響,因為

  1. 版本二已成為預設版本多年。
  2. Flutter 工具會阻止構建版本一應用程式,除非使用 --ignore-deprecation 標誌特別覆蓋。

此版本完全中斷了 Flutter 工具對 v1 應用程式的支援。不再可以用此方法覆蓋。

插件作者,請注意: 當 v1 android 嵌入最初被棄用時,為插件作者撰寫了一個遷移文檔:https://docs.flutter.dev/release/breaking-changes/plugin-api-migration。作為此遷移的一部分,建議插件作者透過在其 Plugin.java 中包含具有以下簽章的方法,來保持對使用 v1 嵌入的應用程式的支援:

1
public static void registerWith(@NonNull io.flutter.plugin.common.PluginRegistry.Registrar registrar) 

我們計劃在下一個版本中完全刪除 v1 Android 嵌入,屆時包含具有此簽章的方法的插件將無法編譯(因為它會引用 v1 android 嵌入中的類型)。

它目前沒有任何作用,因為此版本中斷了使用 v1 嵌入的應用程式。我們建議插件作者儘快發佈已移除 v1 程式碼的插件更新版本,以避免在將來的 Flutter 版本中出現中斷。例如,請查看 PR 6494,該 PR 移除 Flutter 團隊維護的插件。

在 3.22 中移除的棄用

此版本中的 重大變更 包括在 v3.19 發佈後過期的棄用 API。若要查看所有受影響的 API,以及其他內容和遷移指南,請查看 此版本的棄用指南。這些 API 中的許多都由 Flutter fix 支援,包括 IDE 中的快速修復。可以使用 dart fix 命令列工具評估和應用批量修復。

與往常一樣,非常感謝社群為 貢獻測試 - 這些測試幫助我們識別出這些重大變更。若要進一步了解,請查看 Flutter 的重大變更政策

結語

Flutter 成功背後的核心是您 - 我們非凡的社群。沒有您無數的貢獻和堅定的熱情,這個版本是不可能實現的。我們衷心感謝您。

準備探索 Flutter 3.22 嗎?深入了解完整的發行備註和變更日誌,啟動您的終端機,然後運行 flutter upgrade。我們迫不及待想看看您會建立什麼!


Flutter 3.22 的新功能 最初發佈在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。