使用 Flutter 3.19 更高效地開發
我們已隆重推出全新的 Flutter 版本——Flutter 3.19。此版本引入了專為 Gemini 設計的新 Dart SDK、一個能讓開發者對 Widget 動畫實現精細化控制的全新 Widget,Impeller 更新帶來的渲染效能提升、有助於實現深層連結的工具和對 Windows Arm64 的支援,以及更多豐富功能!
Flutter 社群持續展現出令人讚歎的實力,有 168 名社群成員合併了 1,429 個拉取請求 (pull request),其中有 43 名社群成員送出了他們的首個 Flutter 拉取請求 (pull request)!
歡迎你繼續閱讀本篇文章,瞭解 Flutter 社群為這個最新版本帶來的所有新功能和改進!
AI 整合
Gemini Google AI Dart SDK 測試版發布
Google AI Dart SDK 已發布測試版,這使得你能夠利用 Google 最新的 Gemini 系列 AI 模型,在 Dart 或 Flutter 應用中建立生成式 AI 功能。目前 pub.dev 上已提供 google_generative_ai package。如要詳細瞭解如何使用 Google AI Dart SDK 進行開發,你可以參閱 此博文,或者直接查閱 Dart 快速入門 教程。
框架
捲動最佳化
以前在 Flutter 中,當你使用兩隻手指拖動時,捲動速度會是單指的兩倍。現在,你可以使用 MultiTouchDragStrategy.latestPointer 來設定預設的 ScrollBehavior,實現與觸控點數量無關的捲動行為。若想了解有關此變更的更多訊息,你可以參閱 遷移指南。
我們還完成了 SingleChildScrollView
和 ReorderableList
的錯誤修復,解決了多個報告的崩潰和意外行為問題。
我們還解決了一個關於二維捲動的問題,現在當你在任一方向進行捲動操作時,如果進行拖動或點按,捲動活動將按預期停止。
自上次發布以來,我們對 two_dimensional_scrollables
package 中的 TableView Widget
也進行了更新。此次更新改善了其整體表現、增加了對合並單元格的支援,並且在 Flutter 3.16 穩定版 發布後,採用了更多二維捲動基礎元件的新功能。
AnimationStyle
得益於 Flutter 社群成員 @TahaTesser 的 貢獻,Flutter 現在新增了一個名為 AnimationStyle 的 Widget。該 Widget 可讓使用者覆蓋 MaterialApp
、ExpansionTile
和 PopupMenuButton
等 Widget 中的預設動畫行為,幫助開發者覆蓋動畫曲線和時長。
SegmentedButton.styleFrom
Flutter 社群成員 @AcarFurkan 新增了一個 styleFrom
靜態實用方法,類似於其他按鈕型別所提供的方法,能夠快速建立 SegmentedButton
的 ButtonStyle
,與其他分段按鈕共享,或者用於設定應用的 SegmentedButtonTheme
。
自適應開關
這個自適應元件在 macOS 和 iOS 平台上的外觀和風格就像原生控制元件,而在其他平台上則遵循 Material Design 的外觀和風格。它並不依賴於 Cupertino 函式庫,因此其 API 在所有平台上都是完全一致的。
想要瞭解詳情,你可以參閱 自適應開關拉取請求,以及 Switch.adaptive 建構式函式 API 頁面 上的實時範例。
SemanticsProperties 可訪問性識別符號
SemanticsProperties
中新增了一個可訪問性識別符號,用於為原生可訪問性層級中的語義節點提供識別符號。在 Android 平台上,這個識別符號會以 resource-id 的形式出現在可訪問性層級結構中;在 iOS 平台上,該識別符號會設定 UIAccessibilityElement.accessibilityIdentifier
。感謝社群成員 @bartekpacia 對這一涉及到 引擎 和 框架 層面的改變所做出的貢獻。
增加了對文字 Widget 狀態的訪問許可權
我們在 TextField
和 TextFormField
中增加了對 MaterialStatesController
的支援,以便你監聽 MaterialState
的變化情況。
UndoHistory 堆疊
我們 修復了 在日語鍵盤上撤銷/重做歷史記錄可能會消失的 問題。現在你可以在條目被推送到 UndoHistory 堆疊之前對其進行修改。
引擎
Impeller 進展
Android OpenGL 預覽版
發布 3.16 穩定版時,我們邀請了使用者在支援 Vulkan 的 Android 裝置上試用 Impeller,覆蓋了市面上 77% 的 Android 裝置。在過去的幾個月裡,我們已經將 Impeller 的 OpenGL 後端功能提升到了與 Vulkan 後端相同的水平,例如新增 對 MSAA 的支援。這意味著 Flutter 應用能夠在幾乎所有 Android 裝置上正確渲染,不過還有少數功能尚在開發,暫未完全支援,如自定義著色器和對外部紋理的全面支援等。
請各位 Flutter 開發者升級到最新穩定版。在 啟用 Impeller 後,如果遇到任何問題,歡迎你隨時送出相關報告。當前階段的反饋對於確保 Impeller 能在 Android 平台上取得成功,以及我們能夠在今年晚些時候有把握地將其設為預設渲染器至關重要。由於 Android 硬體生態系統比 iOS 生態系統更加多樣化,因此關於 Impeller 的最有效的反饋需要包含出現問題的具體裝置型號和所使用的 Android 版本的詳細訊息。
此外,你還需注意,Impeller 的 Vulkan 後端在 除錯 build 中可提供比 Skia 後端更多的除錯功能,且這些功能會產生額外的執行時消耗。因此,我們建議你透過 設定檔案 build 或 發布 build 提供關於 Impeller 效能的反饋。Bug 報告需要包含來自 DevTools 的時間線資料,以及在同一裝置上與 Skia 後端的效能對比資料。最後,我們一如既往地感謝大家提供包含對可復現問題的小型案例加以說明等反饋。
戰略路線圖
在 Impeller 的 Android 預覽階段,繼渲染保真度之後,我們主要關注的是效能。在效能持續逐步提升的同時,一些更大規模的改進工作也在進行中。我們預計透過利用 Vulkan 子通道 技術,來極大地提高高階混合模式的效能。此外,我們還計劃改變渲染策略,從一直以來在 CPU 上對每一個路徑進行細分 (tessellating),轉向採用 Stencil-then-cover 的方法,這將顯著降低 Impeller 在 Android 和 iOS 上的 CPU 使用率。最後,我們希望新的 高斯模糊 實現能夠達到與 Skia 實現相同的吞吐量,並且更符合 iOS 上的模糊慣用用法。
API 改進
字形訊息
在此次發布的版本中,dart:ui
的 Paragraph
物件新增了兩個方法: getClosestGlyphInfoForOffset
和 getGlyphInfoAt
,這兩個方法分別可回傳一個新型別 GlyphInfo
的物件。你可檢視關於新型別 GlyphInfo 的文件。
GPU 跟蹤
在 Impeller 框架下,使用 Metal 的 iOS、macOS、模擬器環境中,以及支援 Vulkan 的 Android 裝置中,Flutter 引擎現會在除錯 build 和設定檔案 build 中為時間軸上的每一幀報告 GPU 時間。這些 GPU 幀時間資料可以在 DevTools 的 “GPUTracer” 標題下進行檢視。
請注意,由於不支援 Vulkan 的 Android 裝置可能會錯誤報告其對於查詢 GPU 時間的支援情況,因此,在這些裝置上,Impeller 的 GPU 跟蹤功能只能透過在 AndroidManifest.xml 檔案中設定標誌來啟用。
<meta-data
android:name="io.flutter.embedding.android.EnableOpenGLGPUTracing"
android:value="true" />
效能最佳化
特化常數
我們的團隊為 Impeller 新增了 特化常數支援。透過在 Impeller 的著色器中利用這一功能,Flutter 引擎的未壓縮二進位檔案大小減少了 將近 350 KB。
背景濾鏡加速
儘管仍有進步空間,但此版本包含一些針對 Impeller 的背景濾鏡和模糊處理的顯著效能改進。具體而言,開源社群貢獻者 @knopp 注意到 Impeller 錯誤地請求了讀取螢幕紋理的功能。移除這一功能後,在我們的基準測試中,對於包含多個背景濾鏡的場景,根據其複雜程度的不同,效能提升了 20% 至 70% 不等。
此外,Impeller 不再對每一個背景濾鏡都 無條件地儲存樣板緩衝區。相反,它現在會記錄任何影響剪輯的操作,並在為背景濾鏡恢復儲存層時,將這些操作重放到一個新的樣板緩衝區中。
透過這一變化,我們在採用 Vulkan 後端執行 Impeller 的 Pixel 7 Pro 上,對動畫高階混合模式進行基準測試時,平均 GPU 幀時間從 55 毫秒顯著提高到了 16 毫秒。同時,90% 的光柵執行緒 CPU 時間也從大約 110 毫秒下降到了 22 毫秒。
Android
深層連結 Web 驗證器
我們從開發者那裡瞭解到,實現深層連結 (將使用者從 Web URL 導向至移動應用中的特定頁面) 一直以來都是一個實施難度較大且容易出錯的任務。因此,我們首先建立了一個驗證工具,以幫助開發者瞭解哪些連結設定不正確,並提供了實施指導。我們非常高興地宣佈,Flutter 深層連結驗證器的早期版本現已推出!
在此早期版本中,Flutter 深層連結驗證器支援對 Android 進行 Web 檢查,這意味著該工具可以驗證你 assetlinks.json
檔案的設定是否正確。你可以開啟 DevTools,點選進入 “深層連結” (Deep Links) 標籤頁,然後匯入一個包含深層連結的 Flutter 專案。深層連結驗證器會顯示你 Web 檔案的設定是否正確。你可以參閱深層連結驗證工具的 測試說明,以瞭解詳細訊息。
希望這款工具能成為簡化你深層連結實現過程的第一步。我們將持續致力於為 iOS 平台提供 Web 檢查支援,並在 iOS 和 Android 兩個平台上都提供應用內檢查支援!
Share.invoke 支援
Android 平台之前缺少文字欄位和檢視上的預設分享按鈕,但在本次發布中我們已經將其新增進來。這是我們持續努力的見證,旨在確保每個平台上的所有預設上下文選單按鈕都可用。你可以透過 PR #107578 持續關注進展情況。
Native Assets 功能
如果你對 Flutter 與 Flutter 程式碼中其它語言函式的互操作性感興趣,你現在可以在 Android 平台上透過 Native Assets 執行 FFI 呼叫。隨時瞭解我們支援 Native Assets 功能的 持續進展。
紋理層混合組合 (TLHC) 模式
Flutter 3.19 版本能夠讓 Google 地圖和文字輸入放大鏡在 TLHC 模式下執行,這意味著你的應用將獲得更好的效能表現。如果你正在使用 Google 地圖,我們鼓勵你測試這些變化,並向我們分享反饋!
這項工作不包括在框架或引擎層面的送出中,但你可以在 PR 5408 中檢視相關內容,以及測試 TLHC 模式的步驟。
自定義系統範圍內的文字選擇工具欄按鈕
Android 應用可以新增自定義的文字選擇選單項,這些選單項將會出現在所有文字選擇選單中,即使用者長按文字時彈出的選單。Flutter 的 TextField 選擇選單現已包含此功能。
iOS
Flutter iOS 原生字型
現在,Flutter 在 iOS 上的文字看起來更加緊湊且更接近原生風格。按照 Apple 的設計指南,iOS 上較小的字型應該排列得更為寬鬆以便在行動裝置上閱讀時更加舒適,而較大的字型則應設計得更為緊湊,以節省空間。在此之前,無論字型大小大小,我們都錯誤地採用了較為寬鬆的小字型大小樣式。而現在,預設情況下 Flutter 將為較大的文字使用更為緊湊的字型樣式。
DevTools
DevTools 更新
此版本的一些 DevTools 亮點包括:
- 在 DevTools 中新增了一個新功能和螢幕,用於驗證 Android 平台上的深層連結設定。
- 在 “增強跟蹤” (Enhance Tracing) 選單中新增了一個選項,用於跟蹤平台渠道活動。這對於帶有外掛的應用很有幫助。
-
效能和 CPU 分析器螢幕現在即使在沒有連線任何應用的情況下也可訪問。之前透過 DevTools 儲存的效能資料或 CPU 設定檔案,現在可以從這些螢幕上重新載入並檢視。
- VS Code 中的 Flutter 側邊欄現在增加了新功能: 如果當前專案尚未啟用新平台,使用者可以直接啟用新的平台。此外,側邊欄上的 DevTools 選單現在提供一個選項,可讓使用者在外部瀏覽器視窗中開啟 DevTools。
如要了解更多訊息,你可以檢視 DevTools 2.29.0、2.30.0 和 2.31.0 的版本說明。
桌面裝置
Windows Arm64 支援
感謝社群成員 @pbo-linaro 的不懈努力,Flutter 在 Windows 平台上現已初步支援 Arm64 架構。這一初始支援為 Flutter 應用能在 Windows Arm64 裝置上更加高效且高效能地原生執行奠定了基礎。儘管這項支援功能仍在開發階段 (你可以在 GitHub 問題 #62597 上跟蹤進展),但這標誌著 Flutter 開發者為在更廣泛的 Windows 裝置上最佳化其運用的執行邁出了卓越的一步。
生態系統
必須提供隱私清單
Flutter 現在在 iOS 平台上包含了隱私清單,以滿足 即將出臺的 Apple 要求。
Flutter 和 Dart Package 生態系統的進展
如果你之前錯過了相關訊息,歡迎檢視我們關於 Flutter 和 Dart Package 生態系統進展 的部落格文章。
棄用和重大變更
放棄對 Windows 7 和 Windows 8 的支援
隨著 Flutter 的不斷發展,我們在 Dart 3.3 和 Flutter 3.19 版本終止了對 Windows 7 和 Windows 8 的支援,進而專注於最新的技術。這一調整符合 Microsoft 的戰略,使我們能夠在現代作業系統上進一步增強 Flutter 的功能。我們深知這可能需要開發者們做出相應的調整,並承諾將全力協助你順利完成轉場。此舉為在受支援的 Windows 版本上建立一個更安全、高效且功能豐富的開發環境奠定了基礎。感謝你的理解和努力適應,在 Flutter 生態系統中,我們將繼續攜手創新,共同進步。
Impeller 抖動效果標誌
Flutter 3.16 穩定版的版本說明中指出,全域標誌 Paint.enableDithering
已被 移除。有關詳細訊息,你可以參閱官方網站上的 重大變更公告。
放棄對 iOS 11 的支援
由於呼叫特定網路 API 時會出現 執行時崩潰 問題,Flutter 不再支援 iOS 11。這意味著針對 Flutter 3.16.6 及更高版本建立的應用將無法在此類裝置上執行。
棄用自動渲染模式
在此版本的 重大變更 中,我們宣佈了一些已棄用的 API,這些 API 對 v3.16 之後的版本不再有效。如要檢視所有受影響的 API 及其附加背景訊息和遷移指南,你可以參閱 此版本的棄用指南。許多棄用的 API 都受到 Flutter fix 的支援,包括 IDE 中的快速修復功能。你可以透過 dart fix 指令行工具來批次評估並應用修復。
非常感謝社群一如既往地 為測試工作所做的貢獻,幫助我們識別以上重大變更。如要了解詳情,你可以檢視 Flutter 的重大變更政策。
在此次發布中,除了已支援的 flutter 和 flutter_test package 之外,flutter_driver package 也首次被納入了棄用策略之中。
即刻體驗
我們特意在本文的開篇部分強調了貢獻者的數量。Flutter 日益發展成一個強大且高效的工具套件,這證明了我們卓越的社群成員的奉獻精神與辛勤努力。我們向每一個人表示由衷的感謝。
如要深入瞭解此版本的具體內容,你可以參閱 Flutter 3.19 的 版本說明和更新日誌,獲取新增功能的詳盡清單。
Flutter 3.19 以及 Dart 3.3 已在穩定渠道中正式發布。開始使用最新版 Flutter 踏上全新開發旅程,就像執行 “flutter upgrade” 一樣輕鬆。