0%

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

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

使用 Gemini API、Impeller 更新和 Windows Arm64 支援徹底改變應用程式開發

今天,我們向您介紹一個新的 Flutter 版本,Flutter 3.19。此版本帶來了新的 Gemini Dart SDK、讓開發人員能夠為 Widget 動畫加入精細控制的 Widget、透過 Impeller 更新提升渲染效能、幫助實作深層連結的工具、Windows Arm64 支援等等!

Flutter 社群持續令人印象深刻,由 168 位社群成員合併了 1429 個拉取請求,其中 43 位社群成員提交了他們的第一個 Flutter 拉取請求!

請繼續閱讀,了解 Flutter 社群為這個最新版本貢獻的所有新增功能和改進!

AI 整合

Gemini Google AI Dart SDK beta 版本發佈

Google AI Dart SDK 已發佈至 beta 版本。這讓您能夠使用 Google 最新一代 AI 模型 Gemini 來為您的 Dart 或 Flutter 應用程式建立生成式 AI 功能。現在在 pub.dev 上有一個 google_generative_ai 套件。在 這篇部落格文章 中了解如何在您的 Dart 或 Flutter 應用程式中使用 Google AI Dart SDK,或者直接跳入 Dart 快速入門

架構

捲軸改進

過去,如果您拖動兩根手指,Flutter 的捲軸速度會快兩倍。您現在可以使用 MultiTouchDragStrategy.latestPointer 來設定預設的 ScrollBehavior,以獲得與手指數量無關的捲軸行為。有關此變更的更多資訊,請參閱 遷移指南

我們還完成了針對 SingleChildScrollViewReorderableList 的錯誤修復,解決了许多報道的當機和意外行為。

在二維捲軸中,我們解決了一個問題,因此現在,如果您在捲軸進行時(無論是在任何方向)拖動或點擊,捲軸活動會按預期停止。

two_dimensional_scrollables 套件中的 TableView Widget 也已在上次版本發佈後更新,提供了更多潤色,加入了對合併單元的支援,並在 3.16 的上次穩定版本發佈後採用了 2D 基礎的更多新功能。

AnimationStyle

感謝 Flutter 社群成員 TahaTesser貢獻,Flutter 有了一個新的 AnimationStyle Widget,讓使用者可以覆蓋 Widget(例如 MaterialAppExpansionTilePopupMenuButton)中的預設動畫行為,讓開發人員能夠覆蓋動畫曲線和持續時間。

SegmentedButton.styleFrom

Flutter 社群成員 AcarFurkan 加入了一個 styleFrom 靜態實用方法,就像其他按鈕類型提供的那些方法一樣。此方法讓您能夠快速建立可以與其他分段按鈕共用或用於設定應用程式 SegmentedButtonThemeSegmentedButtonButtonStyle

Adaptive Switch

這個自適應組件在 macOS 和 iOS 上看起來和感覺起來像原生組件,而在其他地方則具有 Material Design 的外觀和感覺。 它不依賴於 Cupertino 函式庫,因此其 API 在所有平台上完全相同。

查看 自適應開關拉取請求 和在 Switch.adaptive 建構函數的 API 頁面 上的實時範例。

SemanticsProperties 無障礙識別碼

SemanticsProperties 中的一個新的無障礙識別碼為原生無障礙層級結構中的語義節點提供了一個識別碼。在 Android 上,它會在無障礙層級結構中顯示為 resource-id。在 iOS 上,這會設定 UIAccessibilityElement.accessibilityIdentifier。我們感謝社群成員 bartekpacia 做出的此項變更,這涉及了 引擎框架

提升對文字 Widget 狀態的存取權

我們在 TextFieldTextFormField 中加入了對 MaterialStatesController 的支援,以便您可以監聽 MaterialState 變更。

UndoHistory 堆疊

我們 修復了 一個問題,在該問題中,撤消/重做歷史記錄可能會在日文鍵盤上消失。您現在可以在項目被推入到 UndoHistory 堆疊之前修改它。

引擎

Impeller 進展

Android OpenGL 預覽

在 3.16 穩定版本中,我們邀請使用者在啟用 Vulkan 的 Android 設備上試用 Impeller,覆蓋了現場 77% 的 Android 設備。在過去的幾個月裡,我們將 Impeller 的 OpenGL 後端提升到與 Vulkan 後端的功能一致,例如,透過加入對 MSAA 的支援。這意味著,幾乎所有 Android 設備上的 Flutter 應用程式都應該能夠正確渲染,除了少數尚未完成的功能,例如自訂著色器和對外部紋理的完全支援,這些功能很快就會推出。

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

此外,作為提醒,Impeller 的 Vulkan 後端在 除錯 版本中啟用了超出 Skia 所使用的額外除錯功能,這些功能具有額外的執行時間開銷。因此,重要的是要從 分析發佈 版本中提供關於 Impeller 效能的回饋。錯誤報告應包含來自 DevTools 的時間線,以及在相同設備上的 Skia 後端的比較。最後,與往常一樣,我們非常感謝包含演示問題的小型可重現測試案例的回饋。

路線圖

在渲染保真度之後,我們在 Impeller Android 預覽期的主要關注點是效能。我們持續取得了漸進的進展,但是還有一些較大的改進正在進行中。我們預計工作將利用 Vulkan 子傳遞 來大幅提高進階混合模式的效能。此外,我們還預計渲染策略從始終在 CPU 上細分每條路徑轉變為 「先模板化然後覆蓋」 方法的變化將大幅降低 Impeller 在 Android 和 iOS 上的 CPU 使用率。最後,我們預計對 高斯模糊 的全新實作將與 Skia 實作的吞吐量相符,並改進 iOS 上模糊的慣用方法。

API 改進

字形資訊

此版本包含 dart:uiParagraph 物件上的兩個新方法:getClosestGlyphInfoForOffsetgetGlyphInfoAt,它們分別回傳新的類型 GlyphInfo 的物件。查看有關新的 GlyphInfo 類型的文件。

GPU 追蹤

在金屬 (iOS、macOS、模擬器) 上的 Impeller 和啟用 Vulkan 的 Android 設備上,Flutter 引擎現在在除錯和分析版本的時間線中報告每個畫面的 GPU 時間。可以透過 DevTools 中的「GPUTracer」標題檢視 GPU 畫面時間。

請注意,由於非 Vulkan Android 設備可能會錯誤地報告其對查詢 GPU 時間的支援,因此 Impeller 的 GPU 追蹤只能在這些設備上透過在 AndroidManifest.xml 檔案中設定的旗標來啟用。

1
2
3
<meta-data
android:name="io.flutter.embedding.android.EnableOpenGLGPUTracing"
android:value="true" />

效能優化

專用常數

團隊為 Impeller 加入 對專用常數的支援。在 Impeller 的著色器中利用此功能,將 Flutter 引擎的未壓縮二進制文件大小減少了 將近 350KB

背景濾鏡加速

還有很多工作要做,但是此版本包含了一些對 Impeller 上的背景濾鏡和模糊的良好效能改進。特別是,開源貢獻者 knopp 注意到,Impeller 錯誤地請求了從螢幕上紋理讀取的能力。移除此功能 提高了包含多個背景濾鏡的場景在我們的基準測試中的效能,提高了 20-70%,具體取決於複雜程度。

此外,Impeller 不再無條件地為每個背景濾鏡儲存模板緩衝區。相反,任何會影響操作的剪輯都會被記錄,並且在為背景濾鏡還原儲存層時會被重新播放到新的模板緩衝區中。

透過此項變更,我們在執行 Vulkan 後端且啟用 Impeller 的 Pixel 7 Pro 上運行的動畫進階混合模式的基準測試結果顯示,平均 GPU 畫面時間從 55ms 提高到 16ms,並且 90% 的柵格執行緒 CPU 時間從大約 110ms 降低到 22ms。

Android

深層連結網頁驗證器

我們從開發人員那裡了解到,深層連結(將使用者從網頁 URL 引導到行動應用程式中的特定頁面)一直以來都很難實現,而且也很容易出错。因此,我們首先創建了一個驗證工具,以幫助開發人員了解哪些連結設定不正確,並提供實現指南。我們很高兴地宣布,Flutter 深層連結驗證器的早期版本現已推出!

在此早期版本中,Flutter 深層連結驗證器支援 Android 上的網頁檢查,這意味著驗證 assetlinks.json 檔案的設定。您可以打開 DevTools,點擊 深层链接 標籤,並匯入包含深層連結的 Flutter 專案。深層連結驗證器會告訴您您的網頁文件是否設定正確。您可以參閱深層連結驗證工具的 測試說明 以獲取更多資訊。

我們希望此工具是簡化深層連結實現旅程的第一步。我們將繼續努力為 iOS 上的網頁檢查和 iOS 和 Android 上的應用程式檢查提供未來的支援!

支援 Share.invoke

文字欄位和視圖上的預設 Share 按鈕過去在 Android 中缺失,但我們已在這個版本中加入了它,這是我們持續努力確保所有預設內容選單按鈕在每個平台上都可以使用的一部分。您可以在 PR #107578 中追蹤這項持續進行的工作。

原生資產功能

如果您對 Flutter 與 Flutter 程式碼中來自其他語言的函數的互操作性感興趣,您現在可以在 Android 上透過原生資產執行 FFI 調用,這是我們對支援原生資產的 持續工作 的一部分。

紋理層混合合成 (TLHC) 模式

Flutter 3.19 包含的工作現在讓 Google Maps 和文字輸入放大鏡可以在 TLHC 模式下工作,這意味著您的應用程式能夠擁有更好的效能。如果您正在使用 Google Maps,我們鼓勵您測試這些更改並給我們提供您的回饋!

這項工作不包括 Framework 或 Engine 下的提交,但您可以在 PR 5408 中查看這項工作,以及測試 THLC 的步驟。

自訂系統範圍文字選取工具列按鈕

Android 應用程式可以加入出現在所有文字選取選單中的自訂文字選取選單項目(當您長按文字時出現的選單)。Flutter 的 TextField 選取選單現在會將這些項目整合進去。

iOS

Flutter iOS 原生字體

Flutter 文字現在在 iOS 上看起來更加緊湊,也更加原生。根據 Apple 的設計指南,iOS 上的較小字體應該更加分散,以便在行動裝置上更容易閱讀,而較大的字體應該更加緊湊,以免占用太多空間。之前,我們在所有情況下都錯誤地使用了較小、更加分散的字體。現在,預設情況下,Flutter 將會為較大的文字使用緊湊字體。

DevTools

DevTools 更新

這個版本中 DevTools 的一些亮點是:

  • 在 DevTools 中加入了一個新的功能和螢幕,用於驗證 Android 上深層連結的設定。
  • 增強追蹤 選單中加入了一個用於追蹤平台通道活動的選項。這對包含 Plugin 的應用程式很有用。
  • 效能和 CPU 分析工具螢幕現在可以在沒有連接的應用程式的情況下使用。先前從 DevTools 儲存的效能資料或 CPU 分析資料可以從這些螢幕中重新載入以供查看。
  • VS Code 中的 Flutter 側邊欄現在具有在當前專案未啟用時啟用新平台的功能,側邊欄中的 DevTools 選單現在有一個選項,用於在外部瀏覽器視窗中打開 DevTools。

若要進一步了解,請查看 DevTools 的發行備註,2.29.02.30.02.31.0

桌面

Windows Arm64 支援

感謝社群成員 pbo-linaro 的出色努力,Windows 上的 Flutter 現在開始支援 Arm64 架構。此項初始支援為在 Windows Arm64 設備上原生執行的 Flutter 應用程式鋪平了道路,讓這些應用程式能夠更加高效地運作。雖然仍處於開發階段,可以在 GitHub 議題 #62597 上追蹤進度,但這項舉措表明,對於想要優化其應用程式以支援更廣泛的 Windows 設備的 Flutter 開發人員來說,這是一項很有前景的增強功能。

生態系統

必要的理由隱私說明

Flutter 現在在 iOS 上包含一個隱私說明,以符合 即將生效的 Apple 要求

Flutter 和 Dart 套件生態系統的進展

如果您錯過了,請查看 1 月份關於 Flutter 和 Dart 套件生態系統進展 部落格文章。

棄用和重大變更

停止支援 Windows 7 和 8

隨著 Flutter 的發展,我們很興奮能夠專注於最新的技術,因此在 Dart 3.3 和 Flutter 3.19 版本中停止對 Windows 7 和 8 的支援。這個調整符合 Microsoft 的策略,讓我們可以在現代作業系統上改進 Flutter。我們感謝開發人員做出的調整,並且致力於幫助您完成這個過渡。此舉為在支援的 Windows 版本上建立更安全、更高效且功能更豐富的開發環境鋪平了道路。感謝您在我們共同創新 Flutter 生態系統的過程中,對我們的理解和適應能力。

Impeller 抖動旗標

如 3.16 穩定版本發佈備註中所述,全域旗標 Paint.enableDithering 已被 移除。查看網站上的 重大變更公告 以獲取完整詳細資訊。

棄用 iOS 11

由於在調用某些網路 API 時發生 執行時間當機,Flutter 不再支援 iOS 11。這意味著針對 Flutter 3.16.6 和更高版本構建的應用程式將無法在這些設備上執行。

棄用自動渲染模式

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

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

這是第一個採用 flutter_driver 套件到棄用政策的版本,除了已經支援的套件 flutterflutter_test 之外。

結語

正如我们在本公告开头所强调的贡献者数量之多,我们是有目的的。Flutter 发展成为一个强大的、高效的工具包,这完全得益于我们令人难以置信的社群的奉献和辛勤工作。衷心感谢每一个人。

若要深入了解此版本中所取得的成果,我們邀請您查看 發行備註和變更日誌,以獲取 Flutter 3.19 中加入的內容的完整列表。

Flutter 3.19 與 Dart 3.3 現在已在 stable channel 上提供。開始使用 Flutter 的最新旅程就像運行 flutter upgrade 一樣簡單。