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

【文章內容使用 Gemini 2.5 Flash 自動翻譯產生】

#### 熱重載、Widget 預覽及更多

簡介

歡迎來到 Flutter 3.35 的季度發布!這次更新旨在提升您的生產力,並帶來了網頁版有狀態熱重載的穩定發布以及 Widget 預覽的實驗性推出!透過我們社群的努力,Flutter 3.35 包含了來自 168 位獨特貢獻者的 1108 個提交,其中 39 位是首次加入我們的成員。讓我們來探索一下新功能!

網頁

網頁版有狀態熱重載現已預設啟用

我們很高興地宣布 Flutter 在網頁上的這個里程碑,並歡迎大家將熱重載加入到他們的網頁開發工作流程中。

我們在實驗階段收到的正面回饋和問題報告幫助很大。Dart 和 Flutter 網頁團隊一直在努力提高熱重載代碼的效能,同時確保更多代碼更改可以成功熱重載。

我們的目標是為所有平台提供無縫且一致的熱重載體驗。雖然您仍然可以使用旗標禁用此功能,但我們計劃在未來的版本中移除該功能。

Wasm 試運行

為了讓 WebAssembly (Wasm) 成為預設的網頁建構目標,每個 JS 建構現在都會執行一次 Wasm 的「試運行」編譯。一系列檢查會判斷您的應用程式是否已準備好支援 Wasm,任何發現都會作為警告發佈到控制台。此功能可以使用 --(no-)wasm-dry-run 旗標進行切換。

有什麼新功能?

以前,您必須明確使用實驗性旗標啟用網頁上的有狀態熱重載。現在,當您運行 Flutter 網頁應用程式時,有狀態熱重載開箱即用!無論您是從命令列運行 Flutter 網頁應用程式,還是從 IDE 或編碼代理啟動它,只需在開發模式下運行它即可自由熱重載。

不再需要 --web-experimental-hot-reload 旗標來啟用熱重載,您可以將其從工作流程或您可能已配置的任何 IDE 啟動配置中移除。

回饋

我們知道每個人的開發環境可能略有不同,因此如果您的環境因此次變更而損壞,您目前可以使用 --no-web-experimental-hot-reload 旗標來禁用熱重載。如果您發現任何問題,請使用 Dart 的 網頁熱重載問題範本 提交錯誤。更多資訊請參閱 網頁熱重載文件

下一步是什麼?

目前正在進行的工作將熱重載帶到更多開發環境,包括 -d web-server。我們預計這將在網頁開發時解鎖您的更多生產力,因此請留意未來的發布!

框架

更具包容性和可訪問性的體驗

讓所有使用者都能夠存取應用程式是 Flutter 框架的基石。此版本繼續我們對一系列改進的承諾,這些改進賦予開發人員更多控制權,並改進了輔助技術使用者開箱即用的體驗。

網頁上更豐富的語義

我們在 Flutter 網頁應用程式如何與螢幕閱讀器和其他工具通訊方面取得了顯著進展。對於國際使用者,我們增加了對語義語言環境的支援 (#171196),確保輔助功能以使用者偏好的語言呈現。

用於建構可存取 Widget 的新工具

開發人員現在擁有更強大的工具來建立複雜的可存取體驗。新的 SemanticsLabelBuilder Widget (#171683) 簡化了將多個資料點組合成單一、連貫的公告的過程,而無需凌亂的字串連接。

對於複雜的可捲動視圖,新的 SliverEnsureSemantics Widget (#166889) 可用於包裝 Sliver,確保即使在捲出視圖時,它們也始終在語義樹中呈現。

核心 Widget 和平台優化

此版本包含大量修復,以優化核心 Widget 的可存取性。

  • 在 iOS 上,CupertinoSliverNavigationBar 現在正確遵循可存取文字縮放 (#168866),並且 VoiceOver Tab 啟用行為現在正常工作 (#170076)。
  • 對於 Android,使用平台視圖時的 Talkback 問題現在可以解決 (#168939),這是嵌入原生組件的應用程式的關鍵修復。
  • CustomPainter 的語義屬性 (#168113) 現在已回填,讓您可以讓自定義繪製的 UI 完全可存取。
  • 文字選取工具列現在針對從右到左 (RTL) 語言正確對齊,改善了全球使用者的體驗 (#169854)。

Material 和 Cupertino:更強大的功能和優化

Material 和 Cupertino 函式庫持續發展,讓您更能掌控應用程式的外觀和感受。

新的和增強的元件

我們新增了全新、備受要求且重要增強的現有元件。

  • 引入 DropdownMenuFormField (#163721): 您現在可以輕鬆地將 M3 DropdownMenu 直接整合到您的表單中。
  • 可捲動 NavigationRail (#169421): 現在可以將 NavigationRail 配置為在目的地多於螢幕可容納的情況下捲動。
  • NavigationDrawer 標頭和頁腳 (#168005): 您現在可以為 NavigationDrawer 加入標頭和頁腳,提供更大的版面彈性。
  • 引入 CupertinoExpansionTile (#165606): 使用新的 CupertinoExpansionTile Widget 建立可展開和可摺疊的列表項目。

更高的保真度和互動性

此版本的一個關鍵主題是優化我們的 Widget,使其盡可能達到像素級完美,並在行為上與其原生對應項保持一致。

  • 許多 Cupertino Widget 已更新為使用 RSuperellipse 形狀 (#167784),賦予它們 iOS 使用者所期望的標誌性連續圓角外觀。
  • 為了讓應用程式感覺更生動和原生,我們為關鍵的互動元件(例如 CupertinoPicker (#170641) 和 CupertinoSlider (#167362))加入了觸覺回饋。
  • Slider 的值指示器現在可以配置為始終可見 (#162223)。

框架中的更多內容

此版本包含許多功能強大的新功能和對框架一些最基本部分的改進,讓您對複雜的 UI 擁有更細粒度的控制。

更強大的 Sliver

對於建構複雜捲軸體驗的開發人員,您現在可以明確控制 sliver 的繪製順序 (或 z-order) (#164818),從而可以正確實作諸如「sticky」標頭等進階效果,這些標頭會與其他 sliver 重疊而不會出現視覺上的錯誤。

更精細地控制導航和表單

我們增加了幾個新功能,讓您更能掌控應用程式的導航和路由。

  • 全螢幕對話框 (#167794):fullscreenDialog 屬性加入到 ModalRoute(及其所有後代)和 showDialog 中。這可以自訂對話框路由的導航行為。
  • 表單改進 (#167060): FormField 現在包含一個 onReset 回調,使其更容易處理表單清除邏輯。

多視窗支援 (引擎)

Canonical 的朋友們在添加多視窗應用程式支援方面繼續取得優異進展!在此版本中,他們實現了在 Windows 和 macOS 中建立和更新視窗的基礎邏輯 (#168728)。後續版本將更新 Linux 並引入實驗性 API 以公開多視窗功能。敬請期待!

文字輸入與選取優化

文字輸入是使用者體驗的基礎部分,此版本帶來了多項優化,使其更強大、更可預測。

  • 更統一的手勢系統: PositionedGestureDetails 介面 (#160714) 的引入統一了所有基於指標的手勢的詳細資訊,並允許您編寫更通用的手勢處理程式碼。
  • iOS 單行捲軸 (#162841): 為了更好地與原生 iOS 行為保持一致,單行文字欄位不再可由使用者捲軸。

Android Home/End 鍵支援 (#168184): 我們增加了對 Android 上的 Home 和 End 鍵盤快捷鍵的支援。

展望未來:解耦 Flutter 的設計函式庫

隨著 Flutter 生態系統的不斷發展和成熟,核心框架也必須如此。這種成熟的關鍵部分是確保 Flutter 的所有部分都能以最能服務社群的速度發展。

為此,我們開始將 Material 和 Cupertino 函式庫從核心 Flutter 框架中移出,並將其移入各自的獨立套件中。我們才剛開始這項工作,並且一如既往地開放並與我們的貢獻者社群合作。

為什麼會改變?

這種演進將使 Material 和 Cupertino 函式庫能夠更頻繁地創新和發布更新,獨立於 Flutter 的季度發布週期。它還賦予社群更直接地貢獻他們每天使用的 UI 函式庫的能力。對於核心框架來說,這種改變將導致一個更專注和穩定的基礎。

這對您意味著什麼?

您的工作流程沒有立即變更。這是一個長期專案的開始,我們致力於讓最終的過渡盡可能順利。我們邀請您關注我們的進度,了解更多關於計畫的資訊,並分享您的回饋。

這是一個成熟且蓬勃發展的生態系統的自然演變。我們相信這項改變將會帶來更強大、更靈活的 Material 和 Cupertino 函式庫,並為社群協作提供更大的機會。

iOS

iOS 26 和 Xcode 26 beta 相容性

我們正在積極努力使 Flutter 與 iOS 26 beta 版 相容。請透過在最新的 beta 版上測試您的應用程式和 Plugin 來幫助我們,並 提交您發現的任何新問題。您可以在此 GitHub 專案 中追蹤我們的進度並查看已知問題列表。

Android

敏感內容保護

在 Android 上,您現在可以使用 Flutter 應用程式中的 SensitiveContent Widget,在媒體投射期間保護敏感使用者內容。使用 API 35 及更高版本,您可以使用此 Widget 在螢幕分享期間遮蔽整個螢幕,並有助於防止資料竊取。有關此功能及其使用方法的更多詳細資訊,請查看 保護敏感內容

引擎

一般引擎更新

3.35 持續專注於改善 Impeller 的效能和相容性。同時也投入了資源,以在 iOS 上採用 UISceneDelegate 並引入額外的工具改進。以下是一些值得注意的新增內容。

引擎

  • 優化:透過在新的執行緒上執行初始化,減少了應用程式啟動時間。

Impeller

  • 優化:從中間目標中移除了 MSAA。
  • 保真度:移除了有損紋理壓縮預設值。
  • 修正:修復了後續繪製中卡住的 MaskFilter。
  • 優化:路徑渲染。
  • 新增:增加了 Vivante GPU 支援。
  • 優化:DrawImageNine 現在使用快速的 Porter Duff 混合。
  • 修正:修復了 VideoPlayer 中的記憶體洩漏。
  • 保真度:增加了模糊半徑計算,以實現更清晰的模糊效果(具有較大的 sigma)。

iOS

  • 修正:解決了在用 ClipRSuperellipse 包裹的 WebView 中崩潰的問題。
  • 修正:從遠端通知在背景啟動應用程式時,影像解碼現在正常運作。
  • 恢復:恢復了文字欄位的 Live Text (OCR) 選項。

Android

  • 遷移:範本專案已遷移至 Android 24。
  • 修正:修正了 Android <= 14 在背景圖片讀取器中崩潰的問題。
  • 修正:修正了 OpenGLES Impeller 中片段著色器中的統一陣列。
  • 修正:修正了 OpenGLES Impeller 中倒置的片段著色器通道。
  • 修正:修正了 FlutterEngineGroup 中的崩潰。

macOS

  • 修正:修正了 Display P3 顏色。

開發工具和 IDE

Dart 和 Flutter MCP 伺服器現已進入穩定通道

實驗性的 Dart 和 Flutter MCP 伺服器 現已在 Dart SDK 的穩定通道上提供。這標誌著我們為每個 Dart 和 Flutter 開發人員提供高效能、AI 輔助開發體驗的願景邁出了重要一步。

為 AI 編碼助手增強 Dart 和 Flutter 上下文

Dart 和 Flutter MCP 伺服器作為橋樑,讓 AI 編碼助手可以透過 Dart 和 Flutter 工具鏈存取專案更多上下文。AI 助手現在不僅可以建議程式碼,還可以深入理解您的專案並代表您採取行動。這使您可以專注於目標,而 AI 則處理機制。

有了 Dart 和 Flutter MCP 伺服器,您可以要求 AI 助手:

  • 修復執行時錯誤:檢查實時 Widget 樹,識別 Flutter RenderFlex 溢出,並自動應用正確的修復。
  • 管理相依性:在 pub.dev 上找到特定任務的最佳套件,將其加入到您的 pubspec.yaml 中,並運行 pub get。
  • 撰寫和更正程式碼:為新功能生成樣板程式碼,然後自行更正它在此過程中引入的任何分析錯誤。
  • 以及更多….

連接到您最喜愛的 AI 工具

透過將您最喜愛的 AI 工具(如 Gemini Code Assist、Firebase Studio、Gemini CLI、GitHub Copilot 和 Cursor)連接到 Dart 和 Flutter MCP 伺服器,您可以解鎖新的生產力水平。

有關 Dart 和 Flutter MCP 伺服器可以做什麼以及如何在您選擇的編輯器中配置它的全面指南,請查看我們的詳細部落格文章 使用 Dart 和 Flutter MCP 伺服器提升您的 Dart 和 Flutter 開發體驗文件

_Fixing a layout issue, enabled by the Dart and Flutter MCP Server (Note: For brevity, parts of this recording have been sped up.)_

DevTools 更新

我們持續對 DevTools 進行一般性、使用者體驗和效能方面的更新。若要了解 Flutter 3.35 中包含的所有更新,請查看 DevTools 2.46.02.47.02.48.0 的發行說明。

實驗性 Widget 預覽來了!

社群高度要求的功能之一是能夠獨立預覽 Widget,類似於其他現代 UI 工具包中可用的工具。我們已經聽到了您的聲音,今天,我們很高興能邁出解決此問題的第一步,推出早期實驗版本的 Flutter Widget 預覽,現在已在穩定通道上提供!

Flutter 的有狀態熱重載對於快速迭代運行中的應用程式來說已經是業界頂尖的。Widget 預覽透過允許您在沙箱環境中視覺化和測試您的 Widget 來補充這一點,完全與完整應用程式分離。這對於建構設計系統或在不同配置(例如各種螢幕尺寸、主題和文字縮放)的矩陣中一次並排測試元件非常寶貴。

_在 Widget 預覽中試驗主題_

這是一個早期、實驗性的版本,您的回饋對其未來至關重要。API 和使用者體驗尚未穩定,並會隨著我們從您那裡學習而改變。根據早期回饋,我們已經在規劃未來的增強功能,包括:

  1. 更緊密的 IDE 整合:我們計畫超越目前獨立的瀏覽器視窗,直接在 VS Code、Android Studio 和 IntelliJ IDEA 中提供一個可選的內嵌預覽窗格。
  2. 通用主題支援:隨著我們在部落格文章中提到的將 Material 和 Cupertino 設計函式庫從核心框架中解耦的計畫推進,Widget 預覽將會發展以更有效地支援自訂和通用設計系統。

我們非常興奮能將此功能交到您手中。要開始使用,請查看文件並告訴我們您的想法!

分析伺服器速度改進

使用分析伺服器的 dart 命令列工具 命令現在運行 AOT 編譯的分析伺服器快照。這包括 dart analyzedart fixdart language-server

使用 AOT 編譯的分析伺服器快照時沒有功能上的差異,但各種測試表明分析專案的時間顯著加快。查看此更新後,我們在範例套件上運行一些常見命令時統計資料的變化:

結果因原始碼而異,但總體而言,一些簡短的命令(例如格式化)現在可以在一小部分時間內完成,而運行時間較長的命令(例如分析)則加快了近 50%。這應該會讓您日常使用該工具時感覺響應更快,並且可以在 CI 系統中運行的常見測試工作流程中產生重大影響。

Android Studio 和 Jetbrains IDE Plugin 更新

隨著 Flutter IntelliJ Plugin M87 版本的發布,現在支援 Android Studio MeerkatNarwhal。有了這個版本,Flutter Plugin 現在還可以安裝在 CLion、GoLand、PyCharm 和其他幾個 JetBrains IDE 上!有關完整列表,請參閱 這裡 的支援產品。感謝 Alex Li (Flutter 和 Dart GDE),他的 PR #7949 以及與我們團隊的勤奮協作是擴展 Plugin 支援的 Jetbrains IDE 數量的驅動力。

有關所有更新和修正的列表,請參閱我們的 變更日誌在此 提交問題。若要獲取最新更新:設定 > Plugin > Flutter > 更新

考慮訂閱開發頻道,以測試每週發布的最新更新。說明請參閱 這裡

_Flutter IntelliJ Plugin M87 版本支援的所有 IDE。_

重大變更與棄用

此版本包含數項重要的棄用和重大變更,這些都是我們持續努力現代化和改進 Flutter 框架的一部分。

  • 元件主題標準化: 此版本標誌著一項重要的長期專案的完成,即元件主題的標準化。為了使主題更一致並與 Material 3 對齊,AppBarThemeBottomAppBarThemeInputDecorationTheme 等元件主題已重構為基於新的、面向資料的 ...ThemeData 類別。
  • Radio Widget 重新設計: RadioCupertinoRadioRadioListTile Widget 已重新設計以提高可訪問性。groupValueonChanged 屬性已棄用,取而代之的是新的 RadioGroup Widget,它管理一組單選按鈕的狀態。
  • Form Widget 和 slivers: Form Widget 不再能直接用作 sliver。若要將 Form 包含在 CustomScrollView 中,應將其包裝在 SliverToBoxAdapter 中。
  • 語義高度和厚度移除: SemanticsConfigurationSemanticsNode 上的 elevationthickness 屬性已移除。這些屬性未實現,其移除簡化了 API。
  • DropdownButtonFormField 值棄用: DropdownButtonFormField 上的 value 參數已棄用並重新命名為 initialValue,以更準確地反映其行為。

有關更多詳細資訊和遷移指南,請參閱我們的 重大變更頁面

Android 上棄用 32 位元 x86 架構

Flutter 已棄用 Android 上的 32 位元 x86 架構。對於大多數開發人員來說,這不會產生任何影響,因為它主要影響較舊的基於 x86 的 Android 模擬器和少數實體設備。32 位元 ARM 和 64 位元 x86_64 模擬器和設備仍然支援。完整的技術細節可在 Dart GitHub 棄用問題 上找到。

舊版 Flutter SDK 的 IDE 支援已棄用

隨著此版本的發布,我們將棄用對 3.13 之前的 Flutter SDK 的 IDE 支援。

在我們的下一個穩定版本中,3.16 之前的 Flutter SDK 將被棄用。

若要了解 Flutter 的棄用政策,請參閱 Flutter 相容性 頁面。若要了解有關 IDE 棄用政策的更多資訊,請參閱 Flutter 開發人員工具的 SDK 支援

如果您是舊版 Dart 或 Flutter SDK 的使用者,且該版本已不再受支援,請務必 下載相容版本

最低 Android SDK 已更改

Flutter 支援的最低 Android SDK,由 flutter.minSdkVersion 提供,現在是 API 24 (Android 7)。如果您已將此值修改為 flutter.minSdkVersion 以外的值,則需要將其提高到至少 24。

此外,Flutter 對某些 Android 特定依賴項的最低要求值已增加。如果需要增加這些值,Flutter 工具將通知您,並提供如何升級的指導(如果工具沒有打印任何警告,則無需採取任何措施)。

您現在至少必須擁有:

  • Gradle 版本:8.7.0
  • Android Gradle Plugin (AGP):8.6.0
  • Java:17

若要解決 AGP 和 Gradle 問題,請 在 Android Studio 中運行 AGP 升級助手從命令列運行它

棄用 pluginClass: none

未來版本的 Flutter 將移除對 plugin pubspec.yaml 檔案中 pluginClass: none 的支援,任何使用此欄位的 plugin 都應將其移除,以確保向前相容性。所有最新版本的 Flutter 都支援在沒有該平台原生程式碼時,不包含 pluginClass: 條目。

結語

Flutter 3.35 是為了為所有人建構更好的開發者體驗而共同努力的成果。我們感謝社群(包括 Canonical 等團隊)的貢獻和回饋,這些貢獻和回饋幫助實現了網頁熱重載和 Widget 預覽等功能。您的熱情推動著 Flutter 的前進,我們很高興看到您將用這些新工具創造出驚人的作品。

有關所有變更的完整列表,請務必查看詳細的發行說明和變更日誌。若要開始使用 Flutter 3.35 中的所有功能,請運行 flutter upgrade。我們迫不及待想看看您會建構什麼!


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