Flutter 3.47 現已推出,帶來一系列令人興奮的新功能。

今天,我們迎來了獨立的 material_ui 和 cupertino_ui 套件的 1.0 版本。這是一個重要的里程碑,將設計系統與核心 SDK 分離。

我們還在各方面提升了效能和工具鏈。本次更新預設將 Impeller 引入桌面平台,為 iOS、macOS 和 Xcode 27 準備了我們的建置管線,並將 Flutter Widget 預覽功能正式升級為穩定版。

因此,請在終端機執行 flutter upgrade 開始體驗,或繼續閱讀以深入了解本次更新的主要變更。

邁向獨立 Flutter 的第一步已實現:Material 和 Cupertino 現已作為獨立套件提供!

Flutter 最強大的優勢之一是其渲染像素級精確的 Material 和 Cupertino 小工具的能力。然而,由於這些設計函式庫過去一直直接捆綁在核心 SDK 中,這減緩了它們的開發速度,並增加了貢獻或保持更新的難度。

雖然核心 SDK 在本次更新中仍包含這些函式庫,但您現在可以選擇使用獨立的 material_ui 和 cupertino_ui 套件,它們已在 pub.dev 上正式達到 1.0 版本。

透過選擇獨立的設計系統,您可以掌控您的設計藍圖。由於 material_ui 和 cupertino_ui 現在託管於 pub.dev,它們可以獨立於每季度的 Flutter SDK 更新,按照自己的每週排程發布錯誤修復和新元件。

分離設計系統帶來了以下好處:

要將您的專案遷移到新的獨立套件,請執行以下指令:

此工具會自動將您的 import 從 package:flutter/material.dart 和 package:flutter/cupertino.dart 更新到新的獨立套件。

注意:如果遷移工具在更新您的 pubspec.yaml 時遇到問題(一個已知的早期錯誤),您可以透過手動執行 flutter pub add material_ui(如果您使用 cupertino_ui 也一併執行),然後再次執行 dart fix --apply 來解決。

核心 SDK 中的原始設計函式庫預計將在即將到來的 11 月份秋季穩定版中正式棄用。如果您正在遷移生態系統中的套件,請將此遷移到獨立套件的舉動視為一個主要版本更新。

為了在生態系統遷移到新的獨立設計函式庫的過程中促進橋接,material_ui 和 cupertino_ui 提供了遷移工具。MaterialUiCompatibilityBridge 允許您的應用程式立即遷移到獨立套件,即使您的一些套件依賴項仍在使用舊版核心 SDK 的 import。

例如,您可以將您的應用程式包裝在相容性橋接中:

作為此轉換的一部分,flutter_localizations 也已被移除。Material 和 Cupertino 小工具的本地化委派和翻譯字串現在分別位於 package:material_ui 和 package:cupertino_ui 中。

將 localizationsDelegates 設定為 GlobalMaterialLocalizations.delegates 現在也包含了 Cupertino 和 Widgets 的委派,簡化了您的設定。

透過在四月凍結 Material 和 Cupertino 函式庫的貢獻,我們能夠確保順利的遷移。material_ui 和 cupertino_ui 中等待您的函式庫與您已經使用的函式庫相同。

既然我們準備好解除凍結,請期待在新套件中定期推出更多修復和功能,目前計劃每週發布一次。我們也很高興正式向社群開放這些套件的貢獻。

隨著 Xcode 27、iOS 27 和 macOS 27 在今年秋季推出,我們大力專注於確保 Flutter 已準備好迎接即將到來的更新。為了確保您的使用者不會遇到第一天的意外情況,我們建議您現在就針對 Apple 的 Beta 版本測試您的應用程式。

此外,為了支援 Xcode 27,最低支援的作業系統版本已提高:

iOS 27 SDK 現在強制要求所有基於 UIKit 的應用程式使用 UIScene 生命週期。使用 Xcode 27 建置且未採用 UIScene 的應用程式將無法啟動。

對於大多數應用程式,Flutter CLI 會在建置過程中自動處理此遷移。然而,如果您在 AppDelegate 中有自訂的原生程式碼,或使用仍依賴舊版應用程式生命週期的外掛程式,則需要手動遷移。在這些情況下,您必須遵循 UIScene/Delegate Adoption Guide 手動遷移。

為了與 Apple 向 Apple Silicon 過渡保持一致,Flutter 正在逐步停止對 Intel 架構 Mac 的支援。我們已禁用在 Intel 硬體上的自動測試執行,並且 Flutter CLI 現在會在 Intel 主機上建置或以雙架構為目標時列印警告。這些警告將在未來的版本中變為錯誤。

您可以透過執行 flutter config --enable-macos-arm64-only 來選擇立即建置僅限 ARM64 的 macOS 應用程式。

社群在遷移到 Swift Package Manager 方面取得了令人難以置信的進展,目前排名前 100 的 iOS 外掛程式中已有 92 個已遷移。如果您先前關閉了 Swift Package Manager,可以透過執行 flutter config --enable-swift-package-manager 再次嘗試。

由於 CocoaPods 目前處於維護模式,未遷移到 SwiftPM 的外掛程式最終將停止運作。未遷移的外掛程式在 pub.dev 上的分數也會降低。如果您維護一個外掛程式,請參閱遷移指南並閱讀我們之前的部落格文章以獲取更多詳細資訊。

本次更新還透過社群貢獻者 @lukemmtt 優化了建置時間,他透過在建置流程早期過濾掉不必要的 SwiftPM 套件方案來改進了建置管線。

我們正積極致力於為 Flutter 網頁應用程式預設啟用 WebAssembly (Wasm),為瀏覽器帶來原生級的效能。如果您尚未測試過您的網頁應用程式的 Wasm 版本,您可以透過將 --wasm 旗標傳遞給您的發布建置指令來立即選擇加入:

在準備此轉換時,請記住 Wasm 需要將您的程式碼庫遷移到新的 JS interop 套件 (package:web),因為不支援舊版的 dart:html 函式庫。升級您專案的套件依賴項通常會自動解決這些舊版 interop 問題。

為了幫助擴展較大的網頁應用程式,本次更新還引入了對 Wasm 延遲載入的實驗性支援。此功能可在主通道上透過旗標啟用,它允許您將 Wasm 應用程式分割成更小的、延遲載入的模組,從而優化初始載入時間:

我們致力於讓桌面平台成為高品質圖形的優先目標。在 Flutter 3.47 中,Impeller 成為 macOS、Windows 和 Linux 的預設渲染器。

如果您不熟悉 Impeller,它是 Flutter 的下一代渲染引擎,從頭開始建置以取代 Skia。透過以現代硬體 API(如 macOS 上的 Metal 和 Windows/Linux 上的 Vulkan)為目標,Impeller 在建置時編譯固定數量的著色器,而不是在執行時動態編譯。這消除了動畫首次播放時的短暫停頓,稱為著色器編譯卡頓,從第一幀開始即可提供始終如一的流暢過渡。在 Impeller 渲染引擎文件中了解更多。

如果您需要暫時退出 Impeller,請遵循以下步驟:

未來的版本將移除回退選項,因此如果您必須恢復使用 Skia,請提交錯誤報告。此外,寬色域色彩 (Wide Gamut Color) 現在在 macOS 上預設啟用,可在支援的硬體上提供豐富、鮮豔且精確的色彩渲染。

與 Canonical 合作,並感謝維護者 @robert-ancell 和 @mattkae 的貢獻,我們正在擴展我們的實驗性桌面視窗 API。Linux 和 Windows 現在支援彈出式視窗,讓您可以建置原生右鍵選單和工具面板。

您現在也可以查詢平台特定控制器上的 windowHandle 以取得底層原生視窗 (HWND, NSWindow, 或 GtkWindow) 的直接指標。這使得能夠存取進階的原生功能,例如 Windows 上的可停靠面板,例如 @orestesgaolin 貢獻的可停靠面板示範:

我們還解決了幾個視窗焦點和實現錯誤。在 Windows 上,啟用視窗不再會將背景視窗拉到前面或在應用程式恢復時搶奪焦點,這要歸功於貢獻者 @9AZX:

在 Linux 上,多視窗建立現在會在接收到合成器的第一幀之前明確實現視窗,修復了早期渲染警告和合成器斷言。

我們還新增了一個新的 sized-to-content API,讓您可以建立自動調整大小以符合其內容的常規視窗和對話方塊視窗。

Windows 和 Linux 現在支援 Flutter 的風味 (flavors)。

例如,您的 pubspec.yaml 檔案可以在不同風味中使用不同的資源:

使用 --flavor 選項來指定您的風味。例如:

感謝 @AngeloAvv 的精彩貢獻!

桌面螢幕的像素密度通常低於行動裝置顯示器,但擁有更多的圖形計算能力。為了在桌面上提供更清晰的文字和更乾淨的向量曲線,使用 Impeller 的 Flutter 引擎現在會在 macOS、Linux 和 Windows 上利用有符號距離函數 (SDF) 渲染。

Flutter Widget 預覽現已穩定,讓您可以即時渲染、檢查和迭代個別 UI 元件,而無需建置或啟動整個應用程式。

隨著這個穩定版的發布,您可以期待:

Flutter 的生態系統持續演進,以滿足使用 GenUI 開發人員的需求,為使用者創造新型態的代理式體驗。genui 套件的 0.10.0 版本最近已發布,帶來了多項修復和新功能,其中包括:

本節重點介紹了社群和 Flutter 團隊為優化所有平台的開發者和使用者體驗而做出的有針對性的改進。

在 Android 上,我們解決了一個虛擬鍵盤問題,其中修飾鍵(如 Shift)可能會在事件期間卡住。金鑰響應器現在會跳過虛擬鍵盤輸入的實體金鑰合成,保持鍵盤互動的乾淨。

為了確保建置穩定性,Flutter 3.47 已針對以下 Android 依賴項版本進行驗證:

為了確保您的應用程式在未來版本中成功建置,我們鼓勵您在建置檔案中使用 Flutter SDK 提供的標準 API 層級變數。對於本次更新,它們配置為以下預設值:

對於 iOS 開發人員,程式碼簽署現在更加透明。感謝社群成員 @alex-medinsh ,CLI 在選擇憑證時會同時顯示 Team ID 和 Team Name。

此外,社群成員 @mozammal-hossain 透過提供更清晰的簽署失敗時的佈建設定檔錯誤訊息,改善了故障排除。

桌面平台也獲得了有針對性的改進。Windows 上的韓文輸入組合的游標定位問題已解決(感謝 @CHOIgoung ),並且 Windows 外掛程式現在可以使用 FlutterEngine::PostPlatformThreadTask 將耗時任務移出平台執行緒。在 Linux 上,@CodeDoctorDE 新增了觸控筆旋轉和壓力回報。

在引擎方面,針對 OpenGLES 的片段著色器不再需要讀取紋理時進行條件式座標翻轉。這現在由頂點著色器處理。請參閱 OpenGLES 渲染到紋理的重大變更頁面以獲取更多詳細資訊。

最後,框架本身更加流暢,改進分散在關鍵元件中:

無障礙和語義:Android 的高對比度和顏色反轉設定現在會自動偵測,感謝 @xxxOVALxxx (MediaQueryData.highContrast 和 MediaQueryData.invertColors)。Text.rich 中的巢狀文字跨度現在與其在語義樹中的佈局順序匹配,並且為 BlockSemantics 新增了鍵盤焦點鎖定。

文字和選取:行動裝置上的文字選取控點在輕微滾動時現在保持穩定,並且鍵盤快捷鍵現在可以關閉開啟的選取功能表。在 Android 上,由於 @JhonaCodes 的貢獻,當選取控點位於螢幕頂部附近時,它們不再遮擋內容選單。

我們還修復了 SelectableRegion 在空的可滾動容器中開始選取時發生的崩潰,並修復了淡入選取文字的視覺高亮偽影,感謝 @ikramhasan 。

手勢和滾動:改進了透過平台視圖嵌入的原生 iOS 視圖的手勢傳播。EdgeDraggingAutoScroller 現在會尊重使用中滾動視圖的 ScrollPhysics,防止鎖定列表上的自動滾動。

核心小工具增強功能:使用 useOriginalColors: true 在 ImageIcon 中保留原始顏色,在 AnimatedCrossFade 中指定裁剪行為,並直接使用 ImageStreamListener 追蹤圖像流錯誤。

一切就緒,基礎已打好。現在只剩下將這些升級帶到您的本地機器上:

在您的 SDK 更新的同時,我們為您準備了一些(有趣的)功課:

我們很高興看到大家將使用這個全新且改進的 Flutter 版本來建置出色的應用程式!

賦能開發者於 Google I/O 2026