【文章內容使用 Gemini 2.5 Flash 自動翻譯產生】
原文:https://flutter.dev/blog/whats-new-in-flutter-3-47
Flutter 3.47 的新功能
依模組設計:獨立 UI 套件和桌上型 Impeller
Flutter 3.47 登場,帶來了一些令人興奮的更新。
今天,我們很高興地發佈獨立 material_ui 和 cupertino_ui 套件的 1.0 版本。這是一個重要的里程碑,它將設計系統從核心 SDK 中分離出來。
我們還全面提升了效能和工具。此版本將 Impeller 預設引入桌面,為 iOS、macOS 和 Xcode 27 準備了我們的管道,並將 Flutter Widget Previews 升級到穩定版。
所以,在您的終端機中執行 flutter upgrade 開始,或者繼續閱讀以了解此版本中的主要變更。
選擇您自己的 UI 冒險
與解耦 Flutter 的第一步已經到來:Material 和 Cupertino 現已作為獨立套件提供!
Flutter 最強大的優勢之一是它能夠渲染像素完美的 Material 和 Cupertino Widget。然而,由於這些設計庫在歷史上是直接捆綁在核心 SDK 中的,這減慢了它們的開發速度,並使得貢獻或保持它們最新變得更加困難。
雖然核心 SDK 在此版本中仍包含這些函式庫,但您現在可以選擇使用已正式在 pub.dev 上達到 1.0 版本的獨立 material_ui 和 cupertino_ui 套件。
解耦設計路線圖(選擇性加入)
透過選擇加入解耦設計系統,您可以控制您的設計路線圖。因為 material_ui 和 cupertino_ui 現在位於 pub.dev 上,它們可以根據自己的每週排程發佈錯誤修復和新元件,獨立於每季度的 Flutter SDK 發佈。
解耦設計系統為我們帶來以下優點:
- 您可以使用最新的 Cupertino 和 Material Widget 風格,而無需強制升級整個 Flutter SDK 版本。
- 我們可以更快、更頻繁地實現貢獻和更新。
- 我們為風格中立的 Flutter 核心 Widget 目錄奠定了基礎,使未來更容易建立自訂設計系統。
如何遷移
若要將您的專案遷移到新的獨立套件,請執行以下命令:
1 | dart fix --apply --code=migrate_design_widgets |
此工具會自動將您的 package:flutter/material.dart 和 package:flutter/cupertino.dart 匯入更新為新的獨立套件。
注意: 如果遷移工具在更新您的
pubspec.yaml時遇到問題(一個已知的早期錯誤),您可以透過手動執行flutter pub add material_ui(如果您使用cupertino_ui,則執行cupertino_ui),然後再次執行dart fix --apply來解決。
核心 SDK 中的原始設計函式庫預計將在即將於 11 月發佈的秋季穩定版中正式棄用。如果您正在遷移生態系統中的套件,請將此遷移到獨立套件的過程視為一個主要版本。
彌合遷移差距
為了方便生態系統遷移到新的獨立設計函式庫,material_ui 和 cupertino_ui 提供了遷移工具。MaterialUiCompatibilityBridge 允許您的應用程式立即遷移到獨立套件,即使您的一些套件相依仍在使用舊的核心 SDK 匯入。
例如,您可以將您的應用程式包裝在相容性橋接器中:
1 | import 'package:material_ui/material_ui.dart'; |
解耦本地化
作為此過渡的一部分,flutter_localizations 也已解綁。Material 和 Cupertino Widget 的本地化委派和翻譯字串現在分別位於 package:material_ui 和 package:cupertino_ui 中。
之前:
1 | import 'package:flutter_localizations/flutter_localizations.dart'; |
之後:
1 | import 'package:material_ui/material_ui.dart'; |
將 localizationsDelegates 設定為 GlobalMaterialLocalizations.delegates 現在也包含 Cupertino 和 Widgets 委派,簡化了您的設定。
開放貢獻
透過在四月凍結對 Material 和 Cupertino 函式庫的貢獻,我們得以確保平穩的遷移。material_ui 和 cupertino_ui 中等著您的函式庫與您目前使用的函式庫相同。
現在我們準備解除凍結,期待在新套件中定期推出更多修復和功能,目前計畫每週發佈。我們也很興奮能正式開放這些套件供社群貢獻。
準備迎接下一波 Apple 更新
隨著 Xcode 27、iOS 27 和 macOS 27 將於今年秋天推出,我們一直致力於確保 Flutter 為即將到來的更新做好準備。為了確保您的使用者不會遇到第一天的驚喜,我們建議您現在就針對 Apple beta 版測試您的應用程式。
此外,為了支援 Xcode 27,最低支援的作業系統版本已提高:
| 平台 | 之前的最低版本 | 新的最低版本 (Flutter 3.47+) |
|---|---|---|
| iOS | 13 | 15 |
| macOS | 10.15 | 12 |
UIScene 生命週期強制要求
iOS 27 SDK 現在對所有基於 UIKit 的應用程式強制執行 UIScene 生命週期。使用 Xcode 27 構建但未採用 UIScene 的應用程式將無法在啟動時啟動。
對於大多數應用程式,Flutter CLI 會在建置期間自動處理此遷移。但是,如果您的 AppDelegate 中有自訂原生程式碼或使用仍依賴舊版應用程式生命週期的外掛,則需要手動遷移。在這些情況下,您必須遵循 UIScene/Delegate 採用指南手動遷移。
逐步淘汰 Intel Mac
為配合 Apple 過渡到 Apple Silicon,Flutter 正在逐步淘汰對基於 Intel 的 Mac 的支援。我們已停用 Intel 硬體上的自動測試執行,並且 Flutter CLI 現在在 Intel 主機上建置或鎖定雙架構時會列印警告。這些警告將在未來版本中變成錯誤。
您可以立即透過執行 flutter config --enable-macos-arm64-only 選擇建置僅限 ARM64 的 macOS 應用程式。
Swift Package Manager 進度
社群在過渡到 Swift Package Manager 方面取得了令人難以置信的進展,前 100 個 iOS Plugin 中有 92 個已遷移。如果您之前關閉了 Swift Package Manager,可以透過執行 flutter config --enable-swift-package-manager 再次嘗試。
由於 CocoaPods 現在處於維護模式,未遷移到 SwiftPM 的 Plugin 最終將停止工作。未遷移的 Plugin 也會獲得較低的 pub.dev 分數。如果您維護一個 Plugin,請查閱 遷移指南 並閱讀我們 之前的部落格文章 以獲取更多詳細資訊。
此版本還透過社群貢獻者 @lukemmtt 優化了建置時間,他透過在建置過程早期過濾掉不必要的 SwiftPM 套件方案來改進了建置管道。
預設啟用 Wasm 的路線圖
我們正在積極努力預設啟用 Flutter Web 應用程式的 WebAssembly (Wasm),為瀏覽器帶來類似原生的效能。如果您尚未用 Wasm 測試您的 Web 應用程式,您可以今天透過向發佈建置命令傳遞 --wasm 標誌來選擇啟用:
1 | flutter build web --release --wasm |
在您準備這次轉換時,請記住 Wasm 需要將您的程式碼庫遷移到新的 JS interop 套件(package:web),因為不支援舊版的 dart:html 函式庫。升級專案的套件相依性通常會自動解決這些舊版 interop 問題。
為了幫助擴展更大的 Web 應用程式,此版本還引入了對 Wasm 延遲載入的實驗性支援。這在 main channel 上提供了一個旗標,它允許您將 Wasm 應用程式分解為更小、延遲載入的模組,從而優化初始載入時間:
1 | flutter build web --release --wasm --enable-wasm-deferred-loading |
Impeller 帶來現代圖形到桌面
我們致力於讓桌面平台成為高效能圖形的頭號目標。在 Flutter 3.47 中,Impeller 成為 macOS、Windows 和 Linux 的預設渲染器。
如果您不熟悉 Impeller,它是 Flutter 的下一代渲染引擎,從頭開始構建以取代 Skia。透過鎖定現代硬體 API(例如 macOS 上的 Metal 和 Windows 和 Linux 上的 Vulkan),Impeller 會在建置時編譯一組固定的著色器,而不是在執行時動態編譯它們。這消除了動畫首次播放時短暫的卡頓(稱為著色器編譯卡頓),從第一幀開始提供始終如一的平滑過渡。在 Impeller 渲染引擎文件中了解更多資訊。
如果您需要暫時選擇退出 Impeller,請遵循以下步驟:
- macOS:在
Info.plist中將FLTEnableImpeller設定為false。 - Windows:在
main.cpp中新增project.set_impeller_switch(flutter::ImpellerSwitch::Disabled)。 - Linux:在
my_application.cc中呼叫fl_dart_project_set_enable_impeller(project, FALSE)。
未來版本將移除備用選項,因此如果您必須恢復使用 Skia,請提交錯誤。此外,macOS 上預設啟用 Wide Gamut Color,可在支援的硬體上提供豐富、生動、精確的顏色渲染。
實驗性多視窗進度
與 Canonical 合作,並感謝維護者 @robert-ancell 和 @mattkae,我們正在擴展我們的實驗性桌面視窗 API。Linux 和 Windows 現在支援彈出視窗,讓您可以建立原生上下文選單和實用程式調色盤。
您現在還可以在平台特定的控制器上查詢 windowHandle,以獲取指向底層原生視窗(HWND、NSWindow 或 GtkWindow)的直接指針。這啟用了進階原生功能存取,例如 Windows 上的可停靠窗格,例如 @orestesgaolin 貢獻的這個可停靠窗格演示:
我們還解決了幾個視窗焦點和實現錯誤。在 Windows 上,啟動視窗不再會將背景視窗拉到前面或在應用程式恢復時奪回焦點,這要歸功於貢獻者 @9AZX:
在 Linux 上,多視窗建立現在明確地實現視窗,然後它們才從合成器接收第一幀,修復了早期渲染警告和合成器斷言。
我們還新增了一個新的 sized-to-content API,可讓您建立自動調整大小以符合其內容的常規和對話框視窗。
桌面版風格
Windows 和 Linux 現在支援 Flutter 風格。
例如,您的 pubspec.yaml 檔案可以在不同的風格上使用不同的資源:
1 | flutter: |
使用 --flavor 選項來指定您的風格。例如:
flutter build windows --flavor flavor_aflutter build linux --flavor flavor_a
感謝 @AngeloAvv 的精彩貢獻!
更銳利的桌面文字
桌面螢幕通常比行動裝置顯示器的像素密度低,但具有更多的圖形計算能力。為了在桌面上提供更銳利的文字和更清晰的向量曲線,使用 Impeller 的 Flutter 引擎現在在 macOS、Linux 和 Windows 上使用有符號距離函數 (SDF) 渲染。
穩定預覽和 GenUI 更新
Widget 預覽達到穩定版
Flutter Widget Preview 現已穩定,可讓您即時渲染、檢查和疊代個別 UI 元件,而無需建置或啟動整個應用程式。
有了這個穩定版本,您可以期待:
- 更快的啟動時間,這要歸功於
widget_preview/資料夾中的本地專案快取,它消除了重複的設定開銷。 - 透過抽象的
PreviewThemeDataAPI 進行更靈活的測試,該 API 支援複雜矩陣測試的順序主題分層。 - 預覽網頁 Widget 時自動同步網頁資源,直接複製您的主專案的
web/資源,在使用 Flutter Web 時自動應用任何自訂主題或自訂您的index.html檔案。
GenUI 的持續進展
Flutter 的生態系統不斷發展,以滿足使用 GenUI 為其使用者建立新型代理體驗的開發人員的需求。genui 套件的 0.10.0 版本最近發佈,帶來了許多修復和新功能,其中包括:
- 一個新的
a2ui_core套件,它集中了與協議相關的類別,包括表達式、目錄條目等。 - 支援 A2UI 的客戶端函數,這使您能夠為代理提供函數,代理可以指示客戶端用於驗證、派生值和其他小任務,而無需往返。
優化平台體驗
本節重點介紹了社群和 Flutter 團隊為改善所有平台上的開發人員和使用者體驗而貢獻的針對性改進。
Android
在 Android 上,我們解決了虛擬鍵盤的一個問題,即在事件期間修飾鍵(如 Shift)可能會卡住。鍵盤回應器現在跳過了虛擬鍵盤輸入的物理鍵合成,保持了鍵盤互動的清晰。
Android 相依性矩陣
為了確保穩定的建置,Flutter 3.47 已針對以下 Android 相依版本進行驗證:
- Java:17(最低要求版本)
- Kotlin Gradle Plugin (KGP):2.4.0
- Android Gradle Plugin (AGP):9.1.0(與 KGP 2.4.0 相容的最新版本)
- Gradle:9.3.1(AGP 9.1.0 的最低要求)
為了確保您的應用程式在未來版本中成功建置,我們鼓勵您在建置檔案中使用 Flutter SDK 提供的標準 API 等級變數。對於此版本,它們已設定以下預設值:
flutter.compileSdkVersion(API 36)flutter.targetSdkVersion(API 36)flutter.minSdkVersion(API 24)
iOS 和 macOS
對於 iOS 開發人員,程式碼簽署現在更加透明。感謝社群成員 @alex-medinsh,CLI 在選擇憑證時會同時顯示 Team ID 和 Team Name。
此外,社群成員 @mozammal-hossain 透過在簽署失敗時提供更清晰的佈建設定檔錯誤訊息來改進疑難排解。
桌面
桌面平台也獲得了有針對性的改進。Windows 上韓語文字組成的插入符號定位問題已解決(感謝 @CHOIgoung),並且 Windows Plugin 現在可以使用 FlutterEngine::PostPlatformThreadTask 將耗時的任務移出平台線程。在 Linux 上,@CodeDoctorDE 加入了觸控筆旋轉和壓力報告。
圖形和引擎
在引擎中,鎖定 OpenGLES 的片段著色器在讀取紋理時不再需要有條件的座標翻轉。現在這在頂點著色器中處理。有關 OpenGLES 渲染到紋理的重大變更頁面,請參閱更多詳細資訊。
框架優化
最後,框架本身更加流暢,主要元件都有改進:
無障礙功能和語義: Android 高對比度和顏色反轉設定現在會自動偵測,感謝 @xxxOVALxxx(MediaQueryData.highContrast 和 MediaQueryData.invertColors)。Text.rich 內部的巢狀文字跨度現在與語義樹中的佈局順序相符,並且為 BlockSemantics 添加了鍵盤焦點阻擋。
文字和選取: 行動裝置上的文字選取控點在輕微捲軸時保持穩定,並且鍵盤快捷鍵現在可以關閉打開的選取選單。在 Android 上,選取控點不再遮擋螢幕頂部附近的上下文選單,這要歸功於 @JhonaCodes。
| BEFORE | AFTER |
|---|---|
![]() |
![]() |
我們還修復了 SelectableRegion 在空可捲軸容器中選取開始時的崩潰問題,並解決了淡入選取文字上的視覺高亮偽影問題,這要歸功於 @ikramhasan。
| BEFORE | AFTER |
|---|---|
![]() |
![]() |
手勢和捲軸: 透過平台視圖嵌入的原生 iOS 視圖的手勢傳播得到改善。EdgeDraggingAutoScroller 現在遵守活動捲軸視圖的 ScrollPhysics,防止在鎖定列表上自動捲軸。
核心 Widget 增強功能: 使用 useOriginalColors: true 保留 ImageIcon 內的原始顏色,在 AnimatedCrossFade 中指定裁剪行為,並使用 ImageStreamListener 直接追蹤圖片串流錯誤。
準備升級
各就各位,基礎已準備就緒。剩下要做的就是將這些升級帶到您的本機:
1 | flutter upgrade |
當您的 SDK 在背景更新時,我們為您準備了一些作業(有趣的那種):
- 認識貢獻者:準備好爆米花,收看我們的新影片系列 Introducing: Flutter Notable Commits,慶祝促成此版本發佈的社群成員。
- 檢查詳細資訊:快速瀏覽 重大變更頁面,為獨立 UI 套件遷移做好準備。
我們很高興能看到大家用這個更新改進的 Flutter 版本能建立什麼!



