【文章翻譯】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,人們在那裡透過突出顯示和回應這個故事來繼續討論。

【文章翻譯】Announcing Dart 3.9

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

大家好,Dart 開發者們!最新的穩定版本 Dart 3.9 正式發布了!

此版本旨在讓您的工作更輕鬆,您的應用程式更高效。透過對 null 安全的關鍵更新、Dart CLI 的效能提升,以及令人興奮的 Dart 和 Flutter MCP 伺服器的加入,以增強您的 AI 助手,有很多值得喜愛的地方。請繼續閱讀,探索 Dart 3.9 中的所有新功能。

宣布 Dart 3.9

語言更新

Null 安全

Dart 3.9 在計算類型提升、可達性和明確賦值時假設 null 安全。要利用這些改進,請將您的套件的 SDK 限制下限設定為 3.9 或更高(sdk: ^3.9.0)。由於此更改,可能會產生更多 dead_code 警告。

健全性更新

我們修復了一個健全性問題,該問題允許直接調用從 getter 返回的值,而無需任何運行時檢查,當 getter 的返回類型是泛型類型參數實例化為 dynamicFunction 時。此健全性問題出現在 dev-compiler DDC 中,沒有其他工具受到影響。

在修復之前,以下 getter 可能會觸發直接調用問題。例如:

1
2
3
4
5
6
7
8
9
10
// The following getter used to trigger an issue with a direct 
// invocation

// The getter
class Container<T> {
T get value => ((int i) => i.isEven) as T;
}

// The direct invocation
Container<dynamic>().value('Invocation with missing runtime checks!');

工具更新

Dart 和 Flutter MCP 伺服器

Dart 和 Flutter MCP 伺服器 充當橋樑,讓 AI 編碼助手(例如 Gemini CLI、Cursor 和 GitHub Copilot)能夠存取更多 Dart 專案的上下文。您的 AI 助手現在不僅可以建議程式碼,還可以深入理解您的專案並代表您採取行動。

透過 Dart 和 Flutter MCP 伺服器,您可以要求 AI 助手執行以下操作:

Dart 和 Flutter MCP 伺服器現已在 Dart SDK 的穩定頻道上可用。

_修復佈局問題,由 Dart 和 Flutter MCP 伺服器啟用(此錄製部分已加速)_

更快的 Dart CLI

以前,當您運行某些 Dart CLI 命令(如 dart analyzedart fix)時,您的電腦必須在運行之前編譯 分析伺服器 的程式碼。現在,這些工具使用分析伺服器的預先編譯 (AOT) 快照,這表示伺服器已經預先編譯成快速的原生機器碼。

結果因原始碼而異,但我們在一個範例套件上運行了一些常用命令,並獲得了一些有趣的結果。像 dart format 這樣的一些短命令現在只需一小部分時間即可完成,而像 dart analyze 這樣運行時間較長的命令則快了近 50%。

Dart CLI 更新後的效能範例結果

pub 用戶端更新

Git 依賴項 現在可以根據 Git 標籤進行版本解析。

當您在描述符中使用 tag_pattern 並且存在版本約束時,所有符合模式的提交都會在解析期間被考慮。在以下範例中,只考慮 my_dependency 的版本 2.0.1 及更高版本:

1
2
3
4
5
6
dependencies:
my_dependency:
git:
url: https://github.com/example/my_dependency
tag_pattern: v{{version}}
version: ^2.0.1

從語言版本 3.9 開始,根套件中的 flutter 限制上限現在受到尊重(dart 限制已經受到尊重)。設定嚴格的 dartflutter 限制對於確保開發團隊在共同開發應用程式時都使用相同的 SDK 版本非常有用(詳情請參閱 問題 #95472)。

例如,在像這樣的一個根 pubspec 中,如果使用不是 3.33.0 版本的 Flutter SDK 調用 pub get,則會失敗:

1
2
3
4
name: my_app
environment:
sdk: ^3.9.0
flutter: 3.33.0

Dart 原生編譯器

我們新增了對當目標作業系統為 Linux 時,針對 ARM(ARM32)和 RISCV64(RV64GC)目標架構的交叉編譯支援

棄用和重大變更

32 位元 x86 架構

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

dart build

dart build 在 beta 頻道上預覽。

dart build -f exe <target> 現在是 dart build cli --target=<target>。有關更多資訊,請參閱 dart build cli --help

總結

Dart 3.9 的介紹就到這裡!我們希望您和我們一樣對這些更新感到興奮。我們總是感謝您的回饋,因此請隨時分享您的想法。下次再見,編碼愉快!


宣布 Dart 3.9 最初發佈於 Dart 的 Medium,人們在那裡透過強調和回應這個故事來繼續對話。

【文章翻譯】Unleash new AI capabilities for Flutter in Firebase Studio

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

在 Firebase Studio 中,Flutter 開發變得更加智慧了!在 I/O Connect India 大會上,我們推出了由 AI 驅動的新功能,旨在為您提供更自動化、更高效的工作流程。在這篇文章中,我們將深入探討 Firebase Studio 中專為 Flutter 設計的全新 AI 增強功能,並向您展示如何利用它們來構建強大的應用程式,就像我們在舞台上展示的演示一樣。

升級 AI 優化 Flutter 模板

Firebase Studio 中的 Flutter 模板獲得了重大升級。憑藉其新的 AI 功能,您可以優化工作區,獲得 AI 優先的體驗。例如,在使用這個新模板構建 I/O Connect India 演示時,Firebase Studio 生成了一個多螢幕電子商務應用程式,包括狀態管理、Firebase 身份驗證、產品、購物車和結帳。AI 優化模板預設為自主代理模式,允許 Gemini 直接進行更改,無需等待批准。我們還將 Gemini 的規則整合到一個(自動生成的)airules.md 文件中,以進一步完善 Gemini 生成的程式碼,使您能夠以更簡化的流程添加功能或生成整個 Flutter 應用程式。

Firebase Studio 中的 Flutter 模板已升級,提供 AI 優先的體驗

自主進行更改

以前,在 Firebase Studio 中處理 Flutter 專案時,您需要手動批准代理模式下的每個程式碼更改。現在這個工作流程已經顯著發展,可以自主(獨立且自動)進行編輯。透過新的代理 (Auto-run) 模式,Gemini 現在可以自主進行更改、生成整個應用程式,並以簡化的流程添加功能。例如,在開發類似於我們的 I/O Connect India 演示應用程式時,您可以使用代理 (Auto-run) 模式在單次互動中無縫整合 Firebase 後端服務並實作複雜的導航模式。鑑於 Gemini 對 Dart 和 Flutter 的強大支援,這種自主模式讓您保持在開發流程中。如果更改與您的預期不完全一致,請放心,Firebase Studio 利用 Git,允許您快速將更改回復到先前的提交。

Firebase Studio 中 Flutter 專案的代理 (Auto-run) 模式

AI 規則

透過升級後的 Flutter 模板,我們將 AI 指令整合到一個新文件:airules.md 中。這個文件(位於專案的根目錄)包含 Gemini 在生成程式碼時要遵循的明確規則,從而提高輸出的品質和相關性。您可以靈活地使用預設的 AI 規則或根據專案的特定需求自訂它們。雖然有很多規則,但這裡有幾個範例:

  • 充當 Flutter 共同開發人員
  • 撰寫單元測試
  • 主動尋找並修復錯誤
  • 選擇要使用的主題、工具、擴充功能和啟動命令
  • 新增和移除 Flutter 套件
  • 遵守 Flutter 和 Dart 程式碼品質的最佳實踐
  • 設定複雜的導航
Firebase Studio 中預設 Flutter AI 規則 (airules.md) 概述

相容於 Dart MCP 伺服器

Firebase Studio 現在包含了對模型上下文協定 (MCP) 的基礎支援,我們很高興地分享它與我們的 Dart MCP 伺服器 協同工作。當整合到 Firebase Studio 中時,Dart MCP 伺服器使 Firebase Studio 中的 Gemini 能夠分析並自動修復專案程式碼中特定於 Dart 和 Flutter 的錯誤。您還可以高效地在 pub.dev 上搜尋最佳套件、管理 pubspec.yaml 中的依賴項、運行測試等等。例如,在構建類似於我們在 I/O Connect India 舞台上演示的 Flutter 應用程式時,Gemini 應該能夠識別並自主糾正靜態和運行時錯誤。目前,Dart MCP 伺服器處於 beta 階段。

若要了解如何在 Firebase Studio 中構建 Flutter 應用程式時使用 Dart MCP 伺服器,請參閱部落格文章:使用 Dart MCP 伺服器增強您的 Dart 和 Flutter 開發體驗

Firebase Studio 中 Flutter 應用程式的 Dart MCP 伺服器配置

與我們一起構建

我們對 Firebase Studio 與 Flutter 的持續整合有著雄心勃勃的計畫,我們渴望 聽取您在 Firebase Studio 中使用 Flutter 的回饋意見,因為您正在探索這些新功能。我們非常期待看到您的創造!


在 Firebase Studio 中釋放 Flutter 的全新 AI 功能 最初發佈於 Flutter 的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

【文章翻譯】Supercharge Your Dart & Flutter Development Experience with the Dart MCP Server

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

透過 Dart MCP Server 提升您的 Dart 和 Flutter 開發體驗

作者:Ander Dobo — 產品經理,Kenzie Davisson — 工程師

AI 開發的格局正在迅速演變,強大的代理能夠協助開發人員完成各種任務。為了真正釋放它們的潛力,這些代理需要存取超越其固有能力的上下文和工具。這就是 Model Context Protocol (MCP) 的作用,它充當標準化的外掛系統,將 AI 模型連接到外部系統和資料來源。Dart MCP Server 是我們針對 Dart 和 Flutter 生態系統實施此標準的成果。

本文探討如何利用 Dart MCP Server 來增強您的 Dart 和 Flutter 開發體驗。我們將介紹 Dart MCP Server 提供的實用工具,並展示如何配置伺服器以用於 Gemini CLI、VS Code 中的 Gemini Code Assist、Cursor 和 VS Code 中的 GitHub Copilot 等常用工具。

這種方法是快速成長的生態系統的一部分。例如,Firebase 團隊最近發布了他們自己的實驗性 Firebase MCP Server,它為 AI 助理提供了管理 Firebase 身份驗證、查詢 Firestore 資料庫以及了解影響您在生產中應用程式的應用程式崩潰類型的工具。

介紹 Dart MCP Server

Dart MCP Server(需要 Dart SDK 3.9/Flutter 3.35 beta 或更高版本)是一個功能強大的工具,它彌合了 AI 編碼助理和 Dart/Flutter 開發生態系統之間的鴻溝。它允許 AI 模型與您的開發環境和正在運行的 Dart 或 Flutter 應用程式互動,提供智能洞察,並使用通常只有您的 IDE 或 Dart & Flutter DevTools 才能存取的工具。

Dart MCP Server 能為您做什麼?

Dart MCP Server 提供不斷增加的工具清單,這些工具讓 AI 助理能夠深入了解您的專案。它可以:

  • 分析並修復 專案程式碼中的錯誤。
  • 內省並與您正在運行的應用程式互動(例如觸發熱重載、取得選取的 Widget、擷取執行時錯誤)。
  • 在 pub.dev 搜尋 最適合您用例的套件。
  • 管理 pubspec.yaml 中的套件相依性。
  • 運行測試 並分析結果。
  • ……還有更多!

有關最新工具清單,請參閱官方文件

Dart MCP Server 實際應用

Dart MCP Server 的真正力量在於它如何讓 AI 助理和代理不僅能夠推斷您專案的上下文,還能透過工具採取行動。大型語言模型 (LLM) 決定使用哪些工具以及何時使用,因此您可以專注於用自然語言描述您的目標。讓我們透過幾個使用 VS Code 中 GitHub Copilot Agent 模式的範例來看看實際應用。

修正執行時佈局錯誤

我們都經歷過這種情況:您建立了一個漂亮的 UI,運行應用程式,卻看到臭名昭昭的 RenderFlex 溢出錯誤的黃黑條紋。現在,您無需手動調試 Widget 樹,而是可以向 AI 助理尋求協助。

提示: 「檢查並修復靜態和執行時分析問題。檢查並修復任何佈局問題。」(注意:為了簡潔起見,此錄製的部分內容已加速。)

在幕後,AI 代理使用 Dart MCP Server 的工具來:

  1. 查看錯誤: 它使用工具從正在運行的應用程式中獲取當前執行時錯誤。
  2. 檢查 UI: 它存取 Flutter Widget 樹以了解導致溢出的佈局。
  3. 應用修復: 借助此上下文,它應用修復並再次檢查是否存在任何剩餘錯誤。

然後您可以保留或撤銷程式碼變更。

透過套件搜尋新增功能

想像一下,您需要為您的應用程式新增一個圖表。您應該使用哪個套件?如何新增它並編寫樣板程式碼?Dart MCP Server 簡化了整個過程。

提示: 「找到一個合適的套件來新增一個線圖,用於繪製一段時間內按鈕按下的次數。」(注意:為了簡潔起見,此錄製的部分內容已加速。)

AI 代理現在充當真正的助手:

  1. 找到正確的工具: 它使用 pub_dev_search 工具來尋找流行且評價很高的圖表函式庫。
  2. 管理相依性: 在您確認其選擇(例如,syncfusion_flutter_charts)後,它使用工具將套件新增到您的 pubspec.yaml 並執行 pub get
  3. 產生程式碼: 它產生新的 Widget 程式碼,包括線圖的樣板程式碼,並將其放置在 UI 中。它甚至會自動更正在此過程中引入的語法錯誤。您可以從那裡進一步自訂。

過去需要研究、閱讀文件、編輯 pubspec.yaml 以及在應用程式中編寫相應程式碼的多步驟過程,現在變成了一個單一請求。

使用流行的 AI 驅動開發環境和工具進行配置

由於 Model Context Protocol 正在迅速成為整合工具鏈和 LLM 的標準,因此可以使用 MCP 伺服器的工具清單不斷增長。Dart MCP Server 可以與任何 MCP 用戶端集成*。請查看 MCP 用戶指南 以獲取用戶端範例清單。

首先,Dart MCP Server 需要 Dart SDK 3.9/Flutter 3.35 beta 或更高版本,因此切換到 beta channel 並運行 flutter upgrade 以確保您擁有最新版本。

*要存取 Dart MCP Server 的所有功能,MCP 用戶端必須支援 工具資源。為了獲得使用 Dart MCP Server 的最佳開發體驗,MCP 用戶端還應該支援

Gemini CLI

Gemini CLI 是一個開源 AI 代理,它將 Gemini 的強大功能直接帶到您的終端機中,提供從您的提示到模型的直接路徑。雖然它擅長編碼,但 Gemini CLI 是一個多功能的本地實用程式,您可以用它來完成各種任務,從內容生成和問題解決到深入研究和任務管理。

請依照快速入門說明在您的機器上安裝 Gemini CLI。

確保您的環境正在運行 Dart SDK 3.9/Flutter 3.35 beta 或更高版本。如果需要,請切換頻道並運行 flutter upgrade

若要配置 Gemini CLI 以使用 Dart MCP Server,請編輯您本地專案中的 .gemini/settings.json 檔案(這只會啟用此專案的伺服器),或編輯您家目錄中的全域 ~/.gemini/settings.json 檔案(這會啟用所有專案的伺服器)。

1
2
3
4
5
6
7
8
9
10
11
{
"mcpServers": {
"dart": {
"command": "dart",
"args": [
"mcp-server",
"--experimental-mcp-server"
]
}
}
}

專業提示:

  • 如果您使用 /mcp 提示 Gemini CLI,您將能夠看到可用的一組 MCP 工具。
  • 如果您的專案有您希望 LLM 了解的特定準則或規則,您可以透過在專案根目錄中新增一個 GEMINI.md 檔案來記錄這些準則或規則。

Gemini Code Assist

注意:這目前需要 Gemini Code Assist「Insiders」頻道。請依照 Gemini Code Assist 說明 啟用 Insiders 版本。

Gemini CLI 的底層技術也已整合到 VS Code 中的 Gemini Code Assist 中,這是一個強大的 AI 助理,直接在您的 IDE 中提供聊天和代理功能。在 代理模式 下,您可以在聊天視窗中撰寫提示,並觀察 Gemini 如何努力滿足您的請求。請依照 設定指南 開始使用 Gemini Code Assist。

確保您的環境正在運行 Dart SDK 3.9/Flutter 3.35 beta 或更高版本。如果需要,請切換頻道並運行 flutter upgrade

若要設定 Gemini Code Assist 使用 Dart MCP Server,請依照以下說明操作:

  1. 首先安裝並設定 Gemini CLI。
  2. 依照上述說明設定 Gemini CLI 以使用 Dart MCP Server,這也會為 Gemini Code Assist 啟用它。

您可以透過在代理模式下的聊天視窗中輸入 /mcp 來驗證 MCP 伺服器是否已正確設定。

Firebase Studio

Firebase Studio 是一個代理式雲端開發環境,可協助您建立和發布生產品質的全端 AI 應用程式,包括 API、後端、前端、行動裝置等等。

若要在 Firebase Studio 中新增 MCP 伺服器

  1. 在您的專案中建立一個 .idx/mcp.json 檔案(如果尚不存在),並將與上述 Gemini CLI 說明相同的 Dart MCP Server 設定新增到該檔案中。
  2. 確保您的環境正在運行 Dart SDK 3.9/Flutter 3.35 beta 或更高版本。如果需要,請切換頻道並運行 flutter upgrade
  3. 透過開啟命令面板 (Shift+Ctrl+P) 並輸入 Firebase Studio: Rebuild Environment 來重建您的工作區以完成設定。

有關 Firebase Studio 中 MCP 伺服器配置的更多資訊,請參閱 自訂您的 Firebase Studio 工作區

VS Code 中的 GitHub Copilot

GitHub Copilot 是一個整合到 VS Code 中的 AI 程式碼助理。Dart VS Code 擴充功能透過向 VS Code 註冊 Dart MCP Server 來為 Copilot 提供簡單的整合。Copilot 或任何其他支援 VS Code MCP API 的 AI 代理會自動為您配置 Dart MCP Server,因此您無需手動操作。

確保您的環境正在運行 Dart SDK 3.9/Flutter 3.35 beta 或更高版本。如果需要,請切換頻道並運行 flutter upgrade

若要設定 Dart MCP Server,請將以下內容新增到您的 VS Code 使用者設定中:

1
"dart.mcpServer": true

您也可以考慮將 "chat.mcp.discovery.enabled": true 添加到您的 VS Code 用戶設置中,以自動發現其他工具(如 Claude Desktop 或 Cursor)中配置的服務器。

Cursor

Cursor 是一個基於 VS Code 的流行 AI 程式碼編輯器。Dart 和 Flutter VS Code 擴充功能可以安裝在 Cursor 中,以提供類似於您在 VS Code 中預期的開發體驗,並提供 Cursor 提供的額外 AI 相關功能。

確保您的環境正在運行 Dart SDK 3.9/Flutter 3.35 beta 或更高版本。如果需要,請切換頻道並運行 flutter upgrade

若要設定 Cursor 以使用 Dart MCP Server,您可以點擊 Dart MCP Server README 檔案中的 Add to Cursor 按鈕(最簡單的方法),或依照官方 Cursor 文件中的說明 安裝 MCP 伺服器。設定 Dart MCP Server 後,您的 .cursor/mcp.json 檔案中應該會出現以下內容,該檔案可以是 專案檔案或全域檔案,具體取決於您希望啟用 MCP 伺服器的位置:

1
2
3
4
5
6
7
8
9
10
11
12
{
"mcpServers": {
"dart": {
"command": "dart",
"args": [
"mcp-server",
"--experimental-mcp-server", // Can be removed for Dart 3.9.0 or later
"--force-roots-fallback" // Workaround for a Cursor issue with Roots support
]
}
}
}

其他工具

Dart MCP Server 可用於支援 MCP 的任何地方*。請依照您選擇的 MCP 用戶端提供的說明來設定 Dart MCP Server。

*並非所有工具都受支援,因為有些工具需要存取特定的 IDE 服務。

接下來是什麼?

此實驗性版本僅是第一步。我們的願景是讓 Dart 和 Flutter 開發人員透過符合您工作方式的 AI 驅動體驗,達到最高的生產力。以下是我們接下來將投入的一些關鍵領域:

  • 更深入、無縫的 IDE 整合: 我們正在與 Firebase Studio、Android Studio 中的 Gemini、Gemini Code Assist 以及其他團隊密切合作,讓 Dart MCP Server 的使用毫不費力。
  • AI 驅動的 DevTools 功能: 我們計劃將 AI 協助直接引入 Dart 和 Flutter DevTools。您無需手動篩選複雜資料,只需在查看時間軸追蹤時向 AI 助理提出問題,例如:「我的應用程式在這裡為何卡頓?」、在檢查記憶體快照時:「什麼原因導致此記憶體洩漏?」,甚至直接從 Flutter Inspector 中:「幫助我修復此佈局問題」。
  • 不斷增長的工具箱: 我們將繼續擴展 MCP 伺服器的功能,例如支援更複雜的重構。

雖然我們的路線圖以我們的願景為指導,但您的 回饋 對於幫助我們確定對您最重要的優先順序至關重要。

結論

透過為您的編碼助理提供專案的上下文和對官方工具鏈的存取權,您可以更快地移動,更有效地解決問題,並專注於最重要的事情:構建美觀、高品質的應用程式。Dart MCP Server 代表了 Dart 和 Flutter AI 驅動開發的重大飛躍,也是我們團隊致力於提供高效開發人員體驗的延續。

這才剛剛開始。隨著 Model Context Protocol 變得更加普及,並且 Dart MCP Server 獲得更多功能,您與 AI 驅動的開發工具和代理之間的協作將會變得更加智慧和無縫。

此功能仍在實驗中,您的回饋非常寶貴。 立即在您最喜歡的編輯器中啟用它,並在我們的 GitHub 儲存庫 上提交問題,讓我們知道您的想法。擁抱 AI 輔助開發的未來,並在您的 Dart 和 Flutter 專案中解鎖新的生產力水平。我們迫不及待想看看您會建立什麼!


透過 Dart MCP Server 提升您的 Dart 和 Flutter 開發體驗 最初發佈於 Flutter 的 Medium 平台,人們在該平台繼續透過標註和回應此故事來進行對話。

【文章翻譯】Dart & Flutter momentum at Google I/O 2025

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

在今天於加州山景城 Shoreline Amphitheatre 舉辦的 Google I/O 大會上,我們分享了 Flutter 如何持續獲得動力,成為受到全球一些最大品牌信賴的生產級應用程式框架。

首先,根據 JetBrains 的 開發者生態系統現狀 調查,自 2021 年以來,Flutter 一直是最常用的多平台應用程式框架。

其次,根據應用程式情報提供商 AppTopia 的數據,Flutter 佔所有新的免費 iOS 應用程式的近 30%。

Apptopia 追蹤 Apple AppStore 和 Google Play 商店中的數百萬個應用程式,並分析和偵測用於建立應用程式的開發者 SDK。Flutter 是我們追蹤的最受歡迎的 SDK 之一:在 Apple AppStore 中,其使用量從 2021 年約佔所有追蹤到的免費應用程式的 10% 穩步增長到 2024 年近 30%!

— Apptopia Inc.

客戶更新

以下是一些體現此增長以及 Flutter 獨特能力(從單個共享源程式碼庫定位任何平台)的品牌和應用程式:

  • NotebookLM:由 Google Labs 打造的新 AI 驅動的研究和寫作助理,剛剛推出了使用 Flutter 建構的行動應用程式。此前,這僅作為網站提供,但團隊收到了許多對行動應用程式的請求。由於開發速度和上市時間至關重要,Flutter 是自然的選擇。我們對其本週的 公開發布 感到興奮。
  • Google Cloud:Google Cloud 團隊將現有的 iOS/Android 應用程式切換到 Flutter,用於建構一系列新功能,例如新的 Cloud Assist,目標是寫一次即可部署到任何地方。他們發現擁有單個共享程式碼庫帶來的 UI 和邏輯一致性帶來了巨大的價值,並認為 Flutter 在不妥協的情況下提供了類似原生的效能和感覺。
  • Universal:我們去年宣布了 Universal Destinations & Experiences 如何在其奧蘭多、好萊塢和大阪的公園中使用 Flutter 開發 其 iOS 和 Android 應用程式。在其最新的主題公園,奧蘭多的 Universal Epic Universe,他們現在也使用 Flutter 為其面向遊客的自助餐飲點餐亭提供支援。他們能夠將他們的應用程式重新設想為一個點餐亭介面——具有豐富的動畫和流暢的過渡。這是展示 Flutter 的靈活性和強大之處的一個很好的範例。
  • Reflection.app:由 完整的 Google 技術堆疊 提供支援——Flutter、Firebase 和 Gemini——為使用者提供周到的日記體驗。
  • teamLab:總部位於東京的 teamLab 為數位內容製作、城市規劃和建築空間設計創造解決方案。他們的博物館應用程式允許參觀者閱讀更多有關展品的信息,甚至可以在手機上與作品進行數位互動。到目前為止,這項新體驗已吸引了 3500 萬使用者。
  • 1080 Motion:另一個例子是來自瑞典的 1080 Motion,他們為世界各地的專業運動員提供最先進的訓練和復健。他們的客戶在提供針對該運動員、該天量身定制的個性化訓練的硬體上接收即時效能回饋。
  • GE Appliances:GE Appliances 使用 Flutter 徹底改變了配備 LCD 螢幕的現代家電上小螢幕的 UI。他們的團隊由許多嵌入式和 JavaScript 開發人員組成,他們發現 Dart 易於學習,這加速了採用並使他們能夠快速提高生產力。未來,他們計劃透過使用 Dart 和 Flutter 建構面向使用者的行動應用程式來擴展其嵌入式起點。

發展 Dart 語言

Dart 是 Flutter 成功的關鍵要素。我們共同發展 Dart 和 Flutter 的能力是 Flutter 業界領先的開發者體驗和生產品質的核心推動力。

我們持續發展 Dart 語言——以下是自 2021 年我們主要的 null safety 功能以來,我們所做的所有改進的可視化呈現。

Dart 語言演進

可感知空值的元素

今天,在 Dart 3.8 中,我們添加了 可感知空值的元素,它允許您在集合中包含一個元素,僅當其運行時值為非空值時。您可以使用此功能重寫以下程式碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 沒有可感知空值的元素的程式碼。
var listWithoutNullAwareElements = [
if (promotableNullableValue != null)
promotableNullableValue,
if (nullable.value != null)
nullable.value!,
if (nullable.value case var value?)
value,
];

使用可感知空值的元素,移除所有那些 if 語句:
// 使用可感知空值的元素的程式碼。
var listWithNullAwareElements = [
?promotableNullableValue,
?nullable.value,
?nullable.value,
];

點縮寫

我們還分享了我們正在開發一項名為 點縮寫 的新語言功能的消息——預計將於今年晚些時候發布——使用一種新的更短的語法來處理 Flutter 程式碼中的重複,用於根據上下文已知類型上的成員:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 沒有點縮寫的程式碼。
Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisSize: MainAxisSize.min,
children: […],
);

// 使用點縮寫的程式碼。
Column(
crossAxisAlignment: .stretch,
mainAxisSize: .min,
children: […],
);

更新開發者體驗

我們非常重視 Dart 和 Flutter 的開發者體驗,並有幾項更新。

屬性編輯器

任何框架中最棘手的部分之一就是學習所有可用的 API。起初這可能會令人不知所措。出色的開發者工具可以在這方面提供很大的幫助——今天我們宣布了一項新的屬性編輯器功能,現在可在 Flutter 3.32 中使用。

VS Code 中的屬性編輯器

當您在 IDE 中選擇一個 Widget 時,它會顯示主要的布局屬性,而無需閱讀文件或轉到宣告。然後,您可以直接在屬性編輯器中輕鬆地更改它們,並讓這些更改傳播到源程式碼。

Pub.dev 改進

我們還對 Dart 套件管理器 pub.dev 進行了幾項改進:我們增加了暗模式支援以獲得更好的對比度,一個新的下載計數功能,可幫助您了解套件的使用情況以及該使用在可用版本之間的分布情況。

我們本週宣布的一項全新功能是熱門套件,它顯示近期使用量顯著增加的套件。這可以用於發現可能感興趣的新套件。

pub.dev 熱門套件

改善格式化

Dart 格式化工具被大多數 Dart 開發人員使用。今年年初,我們添加了新功能,使其能夠自動管理尾隨逗號。根據您的反饋,我們在本週的 Dart 3.8 版本中進行了多項調整,並添加了一個新的設定選項,如果您更喜歡手動維護這些尾隨逗號,可以告訴格式化工具永不移除它們。

Dart 交叉編譯

接下來,我們也改進了 Dart 編譯器,使其能夠從 Windows 或 macOS 編譯適用於 Linux 的 Dart 可執行檔。這對於針對較小的嵌入式設備(如 Raspberry Pi)特別有用。在此之前,如果您沒有 Linux 機器,您必須在 Raspberry Pi 本身上編譯 Dart。

更深入地與平台整合

直接原生互通

去年,我們宣布了一項新計畫——直接原生互通——其願景是最終讓您可以像存取自己的 Dart 程式碼一樣輕鬆地存取原生 API。今天我們分享了幾項更新:

  • 線程合併:歷史上,Flutter 引擎使用兩個獨立的線程——平台線程和 UI 線程。絕大多數平台 API 都必須在平台線程上存取,但 Dart 程式碼在 UI 線程上運行,這使得直接從 Dart 呼叫平台 API 非常麻煩。這項工作現在已經在 Android 和 iOS 的穩定版本中完成,並在 Windows 和 macOS 的 Flutter 3.33 beta 版本中完成。Linux 上的線程合併工作正在進行中。詳細資訊請參閱 追蹤議題
  • 原生資產/建構鉤子:有時您需要與使用另一種語言(例如用 C 語言編寫的機器學習函式庫)編寫的第三方函式庫通訊。 建構鉤子(以前稱為原生資產)支援將原生程式碼與 Dart 套件捆綁,並且截至今天,已在主頻道中提供預覽。
  • ffigen/jnigen:我們持續改進 ffigen 和 jnigen 包裝生成器,並希望在今年下半年分享更多相關消息。

在 Android 上表現優異

  • Impeller:自 3.29 版起,Android 與 iOS 一樣,將 Impeller 設定為預設渲染器,但少數近 10 年的 Android 設備(圖形堆疊非常老舊)除外。為了支援這些設備,我們將在 Android API 等級 28 及更低版本上繼續使用 Skia。
  • Edge-to-edge:自 Flutter 3.27 起,我們將 Android 的 edge-to-edge UI 系統設定為 Flutter 的預設。此支援開啟了設備顯示器的全部高度,供在顯示器頂部或底部沒有系統欄的設備上運行的 Flutter 應用程式使用。這對 Flutter 如何考慮 SafeAreas 和系統 UI 等問題產生了微妙的影響。
  • Scribe:今年我們還添加了對 Android 的「Scribe」功能的支援,該功能將原始手寫內容轉換為實際文字。
  • Material 更新:我們已為 Material 提供了許多更新,包括支援新的頁面轉換、更新的進度指示器和滑塊,以及其他潤色區域。

在 iOS 上表現出色

我們希望為 iOS 打造的開發人員能夠交付美觀、功能豐富的應用程式,因此今年我們一直在努力提高 iOS 的保真度,並改善 Flutter 與 Apple 開發者生態系統的整合:

  • Cupertino 更新:對 Cupertino 函式庫進行了大量投資,以提高其保真度並擴展其涵蓋範圍。我們重新審視了彈簧和捲軸物理特性,對我們的底部工作表、可折疊 Widget、導航列(特別是帶有搜尋欄位的導航列)等 Widget 進行了大量更新。
  • Swift Package Manager:我們正在從 Cocoapods 遷移到 Swift Package Manager,以簡化我們的開發設置。此轉移正在進行中,但已有超過 150 個 plugin 加入了 Swift Package Manager 的支援,我們很高興地宣布其中包含了所有 Firebase plugin。我們的目標是盡快完成向 Swift Package Manager 的轉移!
  • Squircles:還有一件事…我們加入了對 Apple 獨特形狀(稱為 squircle)的新支援,它融合了多種不同形狀的弧線!iOS squircle 的精確算法對許多人來說仍然是個謎,但這並沒有阻止我們根據最高可能的保真度創造我們對它的詮釋。您可以在今天的穩定頻道中找到此功能,其類別為 RSuperellipse,並且我們已經在適當的地方將其包含在我們的 Cupertino Widget 中。

在網頁上表現出色

  • WebAssembly:去年我們宣布了支援將 Flutter 網頁應用程式編譯為 WasmGC,以加快應用程式啟動速度,並在複雜情況下將畫面渲染速度提高一倍。
  • 無障礙功能:我們在無障礙功能系統方面做了大量工作,無論是在效能方面,並且新增了全新的 Semantic Roles 系統,Flutter 會將其轉換為網頁上的標準 aria label。
  • 有狀態熱重載:如果您曾經為行動裝置建構過 Flutter 應用程式並希望將這些體驗帶到網頁上,那麼您可能在開發 Flutter 網頁應用程式時感受到了 Flutter 的旗艦功能——有狀態熱重載——的缺失。今天,我們宣布 Flutter 網頁的有狀態熱重載在所有頻道中提供預覽。您可以立即在 DartPad 中體驗它。

擴展生態系統

Google 很榮幸能支持 Flutter,但 Flutter 開發者的大部分價值來自於我們更廣大的社群。

Canonical

一個主要的貢獻者是 Canonical,他們是 Ubuntu 的幕後推手。他們自己使用 Flutter 來建立 Ubuntu 的第一方應用程式市場,並對為 Flutter 在桌上型電腦上的整體品質做出貢獻感到興奮,包括為多視窗支援貢獻功能。

在 Linux 上運行的多視窗支援

他們也對 Flutter 的重大 線程合併 在桌上型電腦上的實施做出了貢獻。他們還修復了許多與無障礙、文字輸入、焦點以及鍵盤和滑鼠事件相關的問題。

LG

另一家對 Flutter 具有業務關鍵利益的公司是 LG。去年,LG 宣布計劃使用 Flutter 重寫許多其核心 webOS 系統應用程式。今年,LG 很高興地宣布他們對 Flutter 的投資將大幅擴展,目標是完成一個新的 webOS-Flutter SDK 的開發,該 SDK 將允許開發人員將 Flutter 應用程式發布到 LG 內容商店。他們預計明年上半年正式發布。

擁抱 AI

在令人興奮且快速發展的 AI 領域,無論是 AI 驅動的應用程式還是 AI 驅動的開發,我們都有許多消息。

推出 Firebase AI Logic

Firebase 中的 Vertex AI 現已更名為 Firebase AI Logic。除了許多新功能外,它現在允許您從一個單一的 Dart SDK 使用 Vertex AI Gemini API(需支付按用量付費的 Blaze 定價方案費用)或新增的 Gemini Developer API(無成本的 Spark 定價方案可選擇付費)。更多詳細資訊請參閱 Firebase 部落格

DartPad 和 Gemini

我們已將 Gemini 支援直接加入到 DartPad 中,讓您無需設定或安裝即可輕鬆使用 Gemini 程式碼輔助功能。

DartPad 中由 Gemini 驅動的程式碼生成

此功能是使用 Gemini API 建構的。其完整原始碼可在 DartPad GitHub 儲存庫中找到,並可作為示範如何建立由 AI 驅動的開發工具。

Android Studio、VSCode、IntelliJ IDEA 和 Gemini

另一個現在支援 Gemini 的地方是 Android Studio。Flutter 和 Android Studio 團隊 合作,因此,截至最新的 Android Studio 版本(Meerkat Feature Drop),對 Dart 和 Flutter 的 Gemini 支援現在是一流的。

如果您是 VSCode 或 IntelliJ IDEA 的使用者,請放心。 Gemini Code Assist 擴充功能和 Google 帳戶將 Gemini 驅動的程式碼輔助功能帶入您的工作流程,直接在 VS Code 中。

MCP

MCP 是一個令人興奮的新開放協定,目前正迅速獲得動能,用於以標準化的方式讓 AI 代理存取並與各種資料來源和工具互動。

模型上下文協定

我們目前正在實驗,看看它是否能讓我們提供更精確和相關的程式碼生成,並允許處理複雜任務的工具,例如修復佈局問題、管理依賴關係,甚至解決運行時錯誤。

總結

衷心感謝所有讓 Flutter 成為現在的您。我們很自豪能與您一起繼續這趟旅程,打造世界上最好的應用程式框架。

祝您 I/O 大會愉快,查看 精彩的議程影片,並享受使用 Flutter 的樂趣!


Dart & Flutter 在 Google I/O 2025 上的發展勢頭 最初發佈於 Flutter 在 Medium 上,人們在那裡透過標記和回應這篇文章繼續討論。

【文章翻譯】Announcing Dart 3.8

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

此版本帶來了格式化程式更新、集合的 null-aware 元素、新的跨平台開發功能、一種在 pub.dev 上找到熱門套件的更好方法、網頁上熱重載的可用性等等!我們也希望有一些開發人員有興趣加入我們的 FFigen 和 JNIgen 早期存取計畫。

宣布 Dart 3.8

格式化程式更新

在上一個版本中,Dart 包含了大幅重寫的格式化程式,支援一種新的 “tall” 風格。Dart 3.8 版本整合了額外的回饋、修復了錯誤報告並添加了其他改進。

請注意,如果您升級到 Dart 3.8 SDK,您的格式化程式不會改變,直到您更改套件的 pubspec 以選擇加入最新的語言版本。

末尾逗號和更高程式碼

在先前的版本中,末尾逗號會強制周圍的構造拆分。新的格式化程式現在決定是否應該拆分構造,然後根據需要新增或移除末尾逗號。

1
2
3
4
5
6
7
8
9
10
11
// Before formatter
TabBar(tabs: [Tab(text: 'A'), Tab(text: 'B')], labelColor: Colors.white70);

// After formatter
TabBar(
tabs: [
Tab(text: 'A'),
Tab(text: 'B'),
],
labelColor: Colors.white70,
);

如果您偏好舊的行為,可以使用 設定 標誌重新啟用它。

樣式變更

新增了許多樣式變更,這些變更使輸出更緊湊並有所改進。以下是一些範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Previously released formatter (functions)
function(
name:
(param) => another(
argument1,
argument2,
),
);

// Dart 3.8 formatter (functions)
function(
name: (param) => another(
argument1,
argument2,
),
);
1
2
3
4
5
6
7
8
9
10
// Previously released formatter (variables)
variable =
target.property
.method()
.another();

// Dart 3.8 formatter (variables)
variable = target.property
.method()
.another();

交叉編譯

現在支援從 Windows、macOS 和 Linux 開發機器 編譯 到原生 Linux 二進位檔。您可以使用 dart compile exedart compile aot-snapshot 指令以及 --target-os--target-arch 標誌來執行此操作。

1
2
// cross compilation example for an exe
$ dart compile exe --target-os=linux --target-arch=arm64
1
2
// cross compilation example for an aot-snapshot
$ dart compile aot-snapshot --target-os=linux --target-arch=arm64

範例使用案例:

  • 在快速的開發筆記型電腦上(例如 Raspberry Pi)比在功能較弱的嵌入式設備上進行更快編譯。
  • 在非 Linux 開發機器上更快編譯基於 Linux 的後端。

Null-aware 元素

新的 null-aware 元素 讓您可以在集合(例如列表、集合或 map)中新增元素,前提是這些元素不為 null。若要在集合文字中將元素設為 null-aware 元素,請在元素前面加上 ?

一個沒有 null-aware 元素,但移除 null 值的列表:

1
2
3
4
5
6
7
8
9
// Code without null-aware elements
var listWithoutNullAwareElements = [
if (promotableNullableValue != null)
promotableNullableValue,
if (nullable.value != null)
nullable.value!,
if (nullable.value case var value?)
value,
];

一個具有 null-aware 元素,並移除 null 值的列表:

1
2
3
4
5
6
// Code with null-aware elements
var listWithNullAwareElements = [
?promotableNullableValue,
?nullable.value,
?nullable.value,
];

文件導入

現在支援文件導入,這是一種新的基於註解的語法,可以在文件註解中引用外部元素,而無需實際導入它們。此標籤可以在庫指令上方的文件註解中指定。

在以下範例中,[Future] 和 [Future.value] 從 dart:async 函式庫導入,但僅用於文件註解:

1
2
3
4
5
6
7
8
/// @docImport 'dart:async';
library;

/// Doc comments can now reference elements like
/// [Future] and [Future.value] from `dart:async`,
/// even if the library is not imported with an
/// actual import.
class Foo {}

文件導入支援與常規 Dart 導入相同的 URI 風格,包括 dart: 方案、package: 方案和相對路徑。但是,它們不能使用 asshowhide 延遲或配置。

pub.dev 上的熱門套件

pub.dev 首頁 將「最受歡迎的套件」區塊替換為「熱門套件」區塊。這個新區塊展示了近期在採用和社群興趣方面展現出顯著增長的套件。

pub.dev 上的熱門套件區塊

網頁上的熱重載 (實驗性)

當您使用 Dart Development Compiler (DDC) 時,狀態熱重載現在可在網頁上使用。Dart 程式碼的 JS 表示重新設計,讓您可以在執行中的應用程式中替換程式碼。

這項功能仍在迭代中,但 Dart 3.8 提供了首次嘗試的機會,從 Flutter 應用程式開始。有關如何啟用熱重載的說明,請參閱 Flutter 部落格文章

Dart 網頁狀態熱重載

這是一項歷時數年的努力,包括更改運行時類型表示、重新設計類別層次結構以及更新程式碼載入到頁面的方式。目標是達到與 VM 現有熱重載實現完全一致。在幾乎所有情況下,該功能應已與您習慣從 VM 獲得的功能無異。您可以在 問題追蹤器 中找到所有已知問題。

重點在於首先讓 Flutter 應用程式能夠使用此功能,但計劃是稍後將熱重載整合到 build_web_compilers 中,以用於非 Flutter 網頁應用程式。

直接原生互通性

我們很高興推出 FFigen 和 JNIgen 的早期存取計畫,這是旨在簡化原生平台 API 整合的程式碼生成解決方案。我們正在尋找有興趣使用這些解決方案開發或重構 Plugin 的 Flutter Plugin 作者。

若要深入了解,請閱讀標題為 Flutter 朝向無縫互通之路 的部落格文章。其中涵蓋了我們對直接原生互通性的願望、實現目標的路線圖以及早期存取計畫。

總結

Dart 3.8 是我們持續致力於改進開發體驗的證明。我們鼓勵您探索這些新功能——從智慧格式化程式和交叉編譯支援到 null-aware 元素、網頁熱重載,以及原生互通的早期存取。您的見解和貢獻對於 Dart 和 Flutter 的持續成長至關重要,我們迫不及待想看看您將創造出什麼應用程式。

立即升級到 Dart 3.8,祝您程式設計愉快!


宣布 Dart 3.8 最初發佈在 Dart 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

【文章翻譯】Flutter’s path towards seamless interop

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

今天,我們很高興地宣布 [Flutter Plugin 作者的早期體驗計劃](https://docs.google.com/forms/d/e/1FAIpQLScSSBAb0sKsrCFJhXnxbhUWx7bdFbuDqWps5C24KIXdD7E-_Q/viewform?usp=header),他們準備利用程式碼生成解決方案建立/重建 Plugin。這是我們透過使用 FFIgen 和 JNIgen,使 Flutter 開發人員更容易存取原生平台 API 的工作的下一階段開發。只有有限的名額可供申請,提供給那些準備在第一波生產級 Plugin 中直接與我們合作使用 FFIgen 和 JNIgen 的作者。

這篇部落格文章涵蓋了更多關於我們希望透過直接原生互操作性實現什麼,我們計劃如何實現,以及更多關於早期體驗計劃以及如何加入我們旅程的資訊。

根本挑戰

開發人員經常需要呼叫在應用程式運行的主機平台(如 iOS 或 Android)上原生的 API。目前,Flutter 開發人員可以使用 Method Channel 來實現。Method Channel 依賴於 Dart 程式碼和原生程式碼(如 Kotlin 或 Swift)之間的訊息傳遞來呼叫原生 API。也就是說,Dart 程式碼向原生程式碼發送訊息,原生程式碼執行一些操作,然後透過訊息傳回結果來回應。

Method Channel 的根本挑戰在於它們可能很耗時且難以維護。它們需要大量手寫程式碼。維護需要手動更新其實作以呼叫最新的 API 版本。它們也很容易出錯,因為它們依賴於將訊息編碼和解碼為字串,如果 API 改變,這可能會導致執行時錯誤。最後,Method Channel 只支援非同步呼叫,這確保了 UI 保持響應,但可能會增加程式碼的複雜性,包括管理非同步結果、處理錯誤以及處理等待結果時可能出現的延遲。

我們已經透過 [Pigeon](https://pub.dev/packages/pigeon) 解決了使用 Method Channel 的一些痛點,Pigeon 是一個用於為 Dart 和原生 API 生成骨架程式碼的工具,用於處理您本來會手動使用 Method Channel 撰寫的訊息。雖然 Pigeon 減少了包裝方法和撰寫 Dart 和原生程式碼之間訊息處理程式的時間,但具有大型 API 表面積的 API 仍然需要撰寫繁瑣的程式碼。例如,iOS 的應用程式內購 Plugin 與許多 StoreKit 物件互動,由於它們嵌套在其他原生物件中,因此需要大量手動編碼才能將它們轉換為 Objective-C 端的 Pigeon 可序列化類別,並將這些 Pigeon 類別轉換回 Dart 端的包裝類別。

此外,兩個 Plugin 之間的互操作性是一個挑戰,沒有辦法將非序列化物件(例如 Android Image)透過 Dart 傳遞給另一個 Plugin,而無需它們彼此相依。

Flutter 對互操作性的願景

正如 Michael Thompson 在 #FlutterInProduction 期間所說,「我們正在投入大量精力來開發一種新的方法,我們稱之為直接原生互操作。」

我們對互操作性的願景是最終透過簡單且無縫的開發人員體驗,使開發人員更容易存取平台 API。目標是讓 Flutter 開發人員花更多時間關注他們正在嘗試建立的體驗,而減少花時間嘗試利用底層平台的力量。

解決方案

我們計劃透過稱為 FFIgen 和 JNIgen 的程式碼生成解決方案來解決根本的互操作性挑戰,這些解決方案直接處理 Dart 和每個平台的原生程式碼之間的橋接。FFIgen 將生成綁定以包裝 Objective-C 和 Swift API,而 JNIgen 也將以類似的方式為 Java 和 Kotlin API 進行。

與 Method Channel 不同,FFIgen 和 JNIgen 將使 API 能夠同步呼叫,支援樹狀抖動(編譯期間移除未使用的程式碼),並允許更多資料存放在平台層。

理想使用者

在此早期階段,新直接互操作性的理想使用者是對原生平台(iOS、Android 或兩者)有深入了解的 Flutter 開發人員,他們非常渴望更直接且更省力地存取他們需要的任何平台 API。透過 FFIgen 和 JNIgen,他們可以顯著減少將 Dart 與原生平台程式碼橋接的時間,並更容易建立和維護生態系統的 Plugin。

隨著工具隨著時間變得更加強大,我們想像任何熟悉原生平台的 Flutter 開發人員都能夠存取任何平台 API(例如尚無法在 Flutter 中生產或透過 pub.dev 上的套件取得的 API),以生成他們所需的程式碼,以便直接在 Flutter 應用程式中呼叫 Dart 程式碼。

我們希望透過簡化的開發人員體驗來實現比現有解決方案顯著更好的解決方案 - 在正確的地方具有魔力,同時又不迫使開發人員放棄控制。

加入互操作早期體驗計劃

我們正在尋找在建立 Flutter Plugin 和使用 Flutter 工具方面經驗豐富的候選人,以嘗試早期體驗計劃,您將重寫現有的 Plugin 以使用直接互操作,並提供詳細的意見回饋和問題來指導未來的開發。與任何預覽計劃一樣,過程中難免會有粗糙之處,但我們已準備好提供支援和早期存取權限,以克服您遇到的任何障礙。

請透過 [填寫此表單](https://docs.google.com/forms/d/e/1FAIpQLScSSBAb0sKsrCFJhXnxbhUWx7bdFbuDqWps5C24KIXdD7E-_Q/viewform?usp=header) 表達您的興趣。我們可能無法將所有申請此早期計劃的人都納入。選定的候選人將在 2025 年 6 月 20 日之後收到我們的通知。

我們期待收到您的來信!


Flutter 通往無縫互操作的道路 最初發佈在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

【文章翻譯】Gemini in Android Studio now speaks fluent Flutter!

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

作者:Ander Dobo,Flutter 產品經理,與 Sandhya Mohan,Android Studio 中 Gemini 的產品經理

我們很高興地宣布,對於在 Android Studio 中建立 Android 應用程式的 Flutter 開發人員來說,這是一個重大的飛躍。Android Studio 中的 Gemini 現在提供 Dart 和 Flutter 開發的第一級支援! 這意味著您可以直接在您最喜歡的 IDE 中利用 Gemini 的強大功能,以前所未有的速度和輕鬆地建立美麗、高效能的 Flutter 應用程式。

多年來,Flutter 讓開發人員能夠從單一程式碼庫建立令人驚嘆的多平台體驗。Android Studio 一直是這段旅程的基石,為許多 Flutter 開發人員提供了一個強大且熟悉的環境。

我們知道您一直在尋找提升生產力和簡化工作流程的方法。您告訴我們您想要更聰明的工具、更好的程式碼補齊,以及解決那些棘手佈局挑戰的幫助。這就是為什麼 Flutter 和 Android Studio 團隊合作確保 Gemini 理解 Flutter 開發的獨特細微之處。這得益於我們持續致力於讓跨平台開發對開發人員更輕鬆

這不僅僅是一般的 AI 協助。Android Studio 中的 Gemini 辨識 Dart 語法,了解 Flutter widget 和佈局,並可以提供專門為您的 Flutter 專案量身打造的上下文相關建議。想像一下:

  • 透過簡單的提示產生 UI 程式碼: 描述您想要的 UI,Gemini 可以產生相應的 Flutter 程式碼。需要一個帶有圓角和特定資料來源的列表視圖?儘管提出!
  • 即時修復佈局錯誤: 不再與溢出的像素或未對齊的 widget 搏鬥。Gemini 可以分析您的佈局,識別問題,並建議(甚至自動應用)修復程式。
  • 解釋複雜的 widget: 不確定特定 widget 如何運作?Gemini 可以提供清晰的解釋並指向相關文件。
  • 自信地重構 Dart 程式碼: Gemini 可以幫助您現代化您的程式碼庫,提高可讀性,並應用最佳實踐。
  • 產生單元和 Widget 測試: 透過 AI 產生的測試加快測試速度。

在 Android Studio 中使用 Gemini 解釋程式碼

這僅僅是個開始。我們致力於持續改進 Gemini 的功能並擴大對 Flutter 的支援。我們積極收集社群的回饋意見,以指導我們的未來開發。

立即免費開始!

準備好體驗 Android Studio 中的 Gemini 對 Flutter 開發的強大功能了嗎?

  1. 下載最新的 Android Studio: 確保您正在運行最新版本的 Android Studio。
  2. 啟用 Gemini: 打開一個 Flutter 專案,並在工具列中尋找 Gemini 圖示。按照提示啟用 Gemini。
  3. 開始聊天: 向 Gemini 提問任何問題!實驗不同的提示,看看它如何幫助您。
  4. 考慮適用於企業的 Android Studio 中的 Gemini: 若要啟用由 Google Cloud 支援的企業級隱私和安全功能,您可以購買 Gemini Code Assist Standard 或 Enterprise 授權。閱讀這篇部落格文章以了解更多資訊。
  5. 給予我們回饋: 我們想聽聽您的意見!為了幫助我們改進,請給產生的輸出評級,使用讚或倒讚。如果您收到您認為不安全、沒有幫助、不準確或因任何其他原因而不良的 AI 回應,請使用您選擇倒讚時出現的提供回饋選項提交回饋意見。

我們非常興奮地看到您使用 Android Studio 中的 Gemini 建立什麼!


Android Studio 中的 Gemini 現在能流利地說 Flutter! 最初發佈在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

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

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

Dash flying towards the text “Flutter 3.32”.

網頁即時熱重載、原生保真度與更深入的整合

簡介

歡迎來到 Flutter 3.32!此版本包含許多旨在加速您的開發並提升您的應用程式的功能。準備好迎接網頁上的即時熱重載、令人驚嘆的 Cupertino 圓角矩形以實現原生保真度,以及與 Firebase 的強大新 AI 整合。Flutter 3.32 包含來自 156 位獨特貢獻者的 1024 次提交,其中包括 39 位首次貢獻者,這證明了我們社群的卓越工作。讓我們一起探索新功能!

網頁

網頁上的熱重載 (實驗性)

我們很高興地宣布,您現在可以在網頁上進行熱重載!網頁支援熱重載是 Flutter 追蹤器上得票數排名第二的議題。我們很高興能讓您有機會在您自己的專案中試用!我們需要您的協助,以確保這項令人興奮的新功能具備開發人員所需的一切。

如果您發現任何問題,請使用 Dart 的 網頁熱重載議題範本 提交錯誤。您可以在 網頁熱重載已知問題 GitHub 專案上找到已知問題列表。

現在是有趣的部分:如何使用此功能

我們新增了一個簡單的命令列旗標 --web-experimental-hot-reload,您可以在任何呼叫 flutter run 的地方將其傳遞給 Flutter。

從 VS Code 執行

如果您在 VS Code 中使用除錯配置,您可以將此額外配置新增至您的 launch.json 檔案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
"configurations": [

{
"name": "Flutter for web (hot reloadable)",
"type": "dart",
"request": "launch",
"program": "lib/main.dart",
"args": [
"-d",
"chrome",
"--web-experimental-hot-reload",
]
}
]

為了獲得最佳效果,我們建議在 VS Code 中啟用「Dart:儲存時 Flutter 熱重載」設定。也可以使用 Run/Debug 面板中的 ⚡ 圖示觸發熱重載。仍然可以使用 ⟳ 按鈕觸發熱重啟。

從命令列執行

如果您在命令列上使用「flutter run」,您現在可以使用以下命令在網頁上運行熱重載:

1
flutter run -d chrome --web-experimental-hot-reload

啟用熱重載後,您可以在運行的終端機中按「r」來重載您的應用程式,或按「R」來熱重啟。

在 DartPad 中重載

熱重載現在也已在 DartPad 中提供,並新增了一個 Reload 按鈕。此功能僅在運行應用程式中檢測到 Flutter 時才可用。您可以使用 DartPad 提供的 範例應用程式 試用。

感謝您花時間協助我們讓網頁上的熱重載變得如此出色!

框架

我們繼續努力將邏輯從 Material 函式庫移至 Widget 函式庫。

此版本引入了一個新的 Expansible Widget,讓您可以更輕鬆地建立具有不同視覺主題的展開和收合 Widget。此新 Widget 作為 Material 風格 ExpansionTile 的基礎構成要素。

此版本中的另一項寶貴新增功能是由社群成員 davidhicks980 貢獻的 RawMenuAnchor。此 Widget 現在作為 Material 風格 MenuAnchor 的基礎構成要素,為建立具有各種視覺主題的選單鋪平了道路。此外,RawMenuAnchor 可以獨立作為無樣式選單使用,讓您可以完全控制其外觀。

像這樣的重構可以更好地支援核心 Widget 用於實作 Cupertino 和 Material 等設計語言(以及更多!)以實現更一致的介面和程式碼共用。

Cupertino

圓角矩形

我們很高興能向 Flutter 的形狀能力引入一項重要的全新功能:圓角超橢圓形。

這種形狀通常被稱為「蘋果圓角矩形」,是 iOS 設計語言的基石,以其比傳統圓角矩形更平滑、更連續的曲線而聞名。社群經常請求支援這種形狀。它的加入代表著我們努力在 Apple 平台上提供具有原生外觀和感覺的高保真 UI 又邁出了一步。

CupertinoAlertDialog 和 CupertinoActionSheet 都已更新為使用這種新的形狀!

您可以使用這些新的 API 將圓角超橢圓形新增到您的應用程式中:

  1. RoundedSuperellipseBorder 用於繪製或作為 Widget 形狀
  2. ClipRSuperellipse 用於裁剪。
  3. Canvas.drawRSuperellipseCanvas.clipRSuperellipsePath.addRSuperellipse 用於提供更直接控制的低階 API。

請注意,圓角超橢圓形仍在積極開發中。目前僅在 iOS 和 Android 上支援,否則行為會回歸標準圓角矩形。效能最佳化也在進行中。我們鼓勵您考慮這些因素來探索這項新功能,我們期待在未來的更新中增強其功能!

工作表

Cupertino 工作表也解決了幾個問題,包括修復工作表在 Android 上打開時如何設定系統 UI 主題。

工作表已調整,以修復導覽列的高度並確保內容底部不會被截斷。以下螢幕截圖顯示了此變更之前和之後的效果。

此版本中的其他修復包括解決工作表轉場與 PopupMenuButton 不相容的問題,以及改進工作表的圓角轉場,使其在更多裝置上看起來正確。之前,它在某些具有不同圓角半徑的螢幕上看起來不正確。

您現在也可以在 CupertinoSheetRouteshowCupertinoSheet 上使用新的 enableDrag 引數來停用 Cupertino 底部工作表的拖曳關閉行為。( #163923**)

導覽列

CupertinoSliverNavigationBar.search 在打開或關閉搜尋視圖時的動畫忠實度有所改進,以及搜尋欄位的前置和後置圖示正確對齊。

最後,CupertinoNavigationBars 或 CupertinoSliverNavigationBars 之間的路由轉場已更新,以符合最新的 iOS 轉場 (#164956)。

Material

此版本為 Material 函式庫帶來了一系列功能增強和錯誤修復,改善了功能和開發人員體驗。

功能增強包括:

  • CarouselController 提供了一個更方便的 animateToIndex 方法,可透過固定或動態大小的項目以及 flexWeights 實現基於索引的平滑輪播導航。
  • TabBar 現在具有 onHoveronFocusChange 回調,讓您可以更好地控制 Widget 在不同狀態下的外觀。
  • SearchAnchor 和 SearchAnchor.bar 現在分別包含 viewOnOpenonOpen 回調,以便更好地觀察和處理開啟/關閉事件。
  • CalendarDatePicker 現在接受一個 calendarDelegate 以實現自訂日曆邏輯的整合,超越公曆系統。範例展示了一個假設的日曆系統,其中偶數月份有 21 天,奇數月份有 28 天,並且每個月份都從星期一開始,展示了此 delegate 的靈活性。

其他次要增強包括為 showDialog、showAdaptiveDialog 和 DialogRoute 新增 animationStyle,以自訂對話框開啟和關閉時的動畫;Divider 現在接受 borderRadius,以允許自訂分隔線的邊框,特別是在分隔線很粗時。

除了新功能外,此版本還解決了 Material 函式庫中與 DropdownMenu 和 Sliders 相關的幾個錯誤:

  • DropdownMenu Widget 現在允許其選單寬度小於文字欄位。範例已更新,以解決之前的 RenderFlex 溢位錯誤。DropdownMenu 的預設寬度現在會尊重文字欄位中的文字標籤寬度。
  • 當滑鼠懸停在 RangeSlider 拇指上時,只會出現懸停拇指的覆疊。之前,兩個覆疊都會不正確地顯示。當軌道顏色透明時,Slider 拇指現在可以到達軌道的兩端,克服了之前無法到達的限制。

輔助使用

最佳化 語義樹編譯

此功能將語義編譯時間減少了約 80%。在 Flutter 網頁應用程式中,這意味著啟用語義後,框架時間減少了 30%。

引入更精細的語義角色

一個新的 SemanticsRole API 已整合到 Semantics Widget 及其相關組件中,為開發人員提供了更精確的控制,以決定 UI 元素如何由輔助技術解釋。此增強功能允許透過簡單地將整個 Widget 子樹包裝在配置有所需角色的 Semantics Widget 中,為其指派特定的角色。

官方 API 文件 中詳細列出了可用角色。目前,此進階語義角色功能僅適用於基於網頁的應用程式,對其他平台的支援將在未來版本中提供。

欲了解更多資訊,請參閱透過語義角色增強輔助使用

其他輔助使用改進

  • 改善 Widget 和螢幕閱讀器的使用者體驗: 改善了各種 Widget 的輔助使用支援和使用者體驗,包括文字欄位、焦點處理、選單、滑塊和下拉式選單。現在,當使用者與這些元素互動時,螢幕閱讀器會提供更詳細的回饋。
  • 透過語義改善網頁焦點導航: 在啟用語義時,優化了網頁焦點行為,顯著減少了 Widget 之間突兀的焦點跳轉,以提供更直觀的導航體驗。
  • 改善 Android TalkBack 對連結的辨識: Android TalkBack 現在可以正確識別和宣告使用 Semantics.linkUrl 或 url_launcher 套件中的 Link Widget 定義的連結。
  • Flutter 網頁應用程式支援 Windows 高對比模式: 引入了對 Windows「強制色彩」模式(通常用於高對比情況)的支援。開發人員現在可以在 ThemeData 中設定 useSystemColors 布林值,以自動將系統色彩應用於 Flutter 主題,從而增強依賴這些設定的使用者的可見性。
  • 精進 iOS 語音控制體驗: 改善了 iOS 語音控制的使用者體驗,確保非操作性 Widget 不再顯示不必要的標籤,為使用者帶來更清晰、更專注的互動。

文字輸入

此版本對文字輸入進行了多項改進:

  1. iOS 上啟動了系統文字選取上下文選單,這在下面的 iOS 部分有說明。
  2. Autocomplete Widget 選項的布局已移植到 OverlayPortal,改善了效能並修復了布局錯誤。
  3. 現在可以在文字欄位中自訂 onTapUpOutside 行為 (#162575)。
  4. 開發人員現在可以為 FormField 產生任何想要的 Widget 作為錯誤訊息,而不僅僅是錯誤文字 (#162255)。
  5. Flutter 中的可選取文字變得錯誤較少 (#162228),並且在網頁上的效能更好 (#161682)。

多視窗支援進度

Canonical 的貢獻者在允許桌面應用程式擁有多個視窗方面取得了顯著進展!

Canonical 修復了應用程式有多個視窗時損壞的幾個功能:

  1. 輔助使用:#164577
  2. 應用程式生命週期通知:#164872
  3. 焦點:#164296
  4. 鍵盤事件:#162131#163962
  5. 文字輸入:#163847#164014
  6. 滑鼠事件:#163855

Canonical 還增加了一個功能,讓 Dart 程式碼 FFI 可以直接與 Flutter 引擎通信 (#163430)。這為 Flutter 未來的視窗 API 奠定了基礎。

最後,Canonical 在 Linux 上引入了一個渲染線程 (#161879)。這提高了框架吞吐量,即使您有多個視窗,也能確保 Flutter Linux 保持流暢。

桌面執行緒合併

Canonical 還更新了 Windows 和 macOS,允許應用程式合併 UI 和平台執行緒 (#162883#162935)。

合併的執行緒讓您可以使用 Dart FFI 與必須在平台執行緒上呼叫的原生 API 進行互操作。例如,如果您在 Windows 上啟用合併的執行緒,您可以使用 Dart FFI 使用 win32 API 調整應用程式視窗的大小!

在 Windows 上,您可以透過在 windows/runner/main.cpp 檔案中的 wWinMain 方法內新增以下內容來開啟合併的執行緒:

1
project.set_ui_thread_policy(UIThreadPolicy::RunOnPlatformThread)

在 macOS 上,您可以透過在您的 macos/Runner/Info.plist 檔案中的 <dict> 元素內新增以下內容來開啟合併的執行緒:

1
2
<key>FLTEnableMergedPlatformUIThread</key>
<true />

在未來版本中,我們將在 Windows 和 macOS 上預設開啟合併的執行緒。請試用此功能,如果您遇到任何錯誤,請 建立議題

iOS

我們增強了 Flutter 應用程式在 iOS 上的貼上體驗!對於沒有自訂操作的基本文字欄位,使用者從其他應用程式貼上內容時將不再看到確認對話方塊。這現在已在所有 Flutter iOS 應用程式上預設啟用。請注意,如果您的應用程式使用自訂操作(例如,上下文選單中的「傳送電子郵件」),此功能 尚未支援

Android

Gradle 工具的 Kotlin 語言重寫

Flutter 的 Gradle Plugin 已從 Groovy 轉換為 Kotlin。這種向 Kotlin 的轉換使程式碼庫更容易貢獻,並且也促進了對 Plugin 引入單元測試。新增的測試以及從動態類型和執行的語言轉換為靜態類型語言,應會為 Flutter 開發人員帶來更穩定可靠的建構過程。我們不預期重寫會導致任何行為變化,因此如果您注意到 Android 建構行為與您預期的不同,請 提交問題

Scribe / Stylus 支援

您現在可以在 Android 上使用觸控筆在文字欄位中書寫,就像 Apple Pencil 手寫輸入已在 Flutter iOS 應用程式上工作一樣。使用者可以直接在任何 Flutter 文字輸入欄位上開始書寫,手寫內容將以文字形式顯示在欄位中。並非所有手勢都已支援,但我們正在 努力彌補這些差距。此功能在 Android 14 及更高版本上支援,並且可以在需要時使用 TextField.stylusHandwritingEnabledCupertinoTextField.stylusHandwritingEnabled 參數停用。

引擎

Android 上的 Impeller

從 3.29.3 版本開始,在執行 Android API 級別 28 (Android 9) 及更舊版本的設備上,Flutter 應用程式將使用傳統的 Skia 渲染器。此變更提高了 Flutter 在較舊 Android 設備上的穩定性。Impeller 繼續成為在執行 API 級別 29 (Android 10) 及更新版本的設備上的預設渲染器。

隨著我們從使用不同裝置的使用者那裡獲得更多回饋,我們調整了哪些裝置使用 Impeller 的 Vulkan 與 OpenGLES 後端。特別是,在此版本中,以下裝置將使用 OpenGLES 而非 Vulkan:Android 模擬器、API 版本低於 31 的 MediaTek 裝置、早於 CXT 的 PowerVR 裝置,以及不支援 Vulkan 1.3 的較舊版本 Samsung XClipse GPU。

如同先前版本,您可以按照 這些指示 選擇不使用 Impeller。由於我們對 Impeller 穩定性和效能越來越有信心,在即將推出的穩定版本中,將會移除在較新 Android 裝置上選擇不使用 Impeller 的功能。

最後,Flutter 3.27 有許多與 Impeller 在支援 Vulkan 的裝置上渲染相關的渲染錯誤和崩潰,這些問題在 3.29 及更高版本中已修復。我們不打算將這些變更熱修復到 3.27 中,我們強烈建議更新到 3.29 或更高版本。如果您的應用程式無法這樣做,我們建議在 Android 裝置上選擇不使用 Impeller。

其他 Impeller 更新

此版本改進了 Impeller 的文字渲染。值得注意的是,文字動畫更流暢,抖動更少,這歸功於 Impeller 字體地圖中更高解析度的字形,以及修復浮點計算中的四捨五入錯誤。有關更多詳細資訊,請參閱 flutter#149652

之前
之後

此版本還包括各種其他準確度和效能改進,包括:

DevTools 與 IDE

[新功能] Flutter 屬性編輯器

透過新的屬性編輯器工具,輕鬆編輯 Widget 屬性並閱讀文件,該工具可從 Flutter 屬性編輯器側邊欄面板 (VS Code) 或工具視窗 (Android Studio / IntelliJ) 存取。

VSCode
Android Studio 與 IntelliJ

設備上 Widget 檢查器中的變更

設備上的 Widget 檢查器新增了一個按鈕,可用於在選取 Widget 模式下開啟或關閉 Widget 選取行為。這允許您在 Widget 選取模式下與應用程式互動 (例如,導航到新頁面) 並選取 Widget。

DevTools 改進

DevTools 進行了額外改進,包括網路螢幕的新離線支援、與熱重啟相關問題的錯誤修復、文字焦點、Deep Links 工具以及 CPU 分析工具和記憶體螢幕的資料改進。此版本還包括 DevTools 的多項效能和記憶體改進,這將導致更快的資料載入時間和更少的記憶體相關崩潰。

這些只是此版本中的部分亮點。要了解 Flutter 3.32 中包含的所有更新,請查看 DevTools 的發行說明:2.44.02.45.02.46.0

分析器改進

我們持續改進 Dart 分析器,進而改善開發者體驗。這包括加入「doc imports」,這是一種新的基於註解的語法,允許在文件註解中引用外部元素,而無需實際匯入它們。請參閱 dart.dev 上的詳細資訊。我們也進行了多項快速修復、協助和重新命名改進。

Android Studio 中的 Gemini 現在能流利地說 Flutter 和 Dart

Android Studio 中的 Gemini 現在為 Dart 和 Flutter 開發提供一流的支援!這意味著您可以直接在您喜歡的 IDE 中利用 Gemini 的強大功能,比以往更快、更輕鬆地建立精美、高效能的 Flutter 應用程式。

閱讀這篇部落格文章 以了解更多資訊。

Dart 和 Flutter 對模型上下文協議 ( MCP ) 的支援即將到來

對模型上下文協議 ( MCP ) 和最近發布的 Dart MCP SDK 的支援正在積極進行中。一個新的 Dart 工具 MCP 伺服器 也在開發中,它將向 MCP 用戶端 (例如 IDE) 公開 Dart 和 Flutter 的靜態、執行時和生態系統工具。

這將為 Dart 和 Flutter 開發人員帶來以下好處:

  • 更準確、更相關的程式碼生成。
  • 複雜的任務,例如修復布局問題、管理依賴項,甚至解決執行時錯誤,都將變得可行,因為 MCP 協議會公開來自實際 Dart 和 Flutter 工具的語義資訊。

請持續關注!

使用 AI 建立

隆重推出 Firebase AI Logic

您可能聽說過,甚至使用過 Firebase 中的 Vertex AI,這是我們用於直接將 Gemini API 驅動功能整合到您的 Flutter 應用程式中的用戶端 SDK。

許多人要求使用 Gemini Developer API,而不是 Vertex AI,以利用慷慨的免費方案並開始免費新增生成式 AI。我們聽到了!從今天起,我們將 Firebase 中的 Vertex AI 演變為 Firebase AI Logic,它只需一個 Flutter SDK 即可存取兩個 Gemini API 提供者。它讓您可以直接從 Flutter 應用程式中使用 Gemini 和 Imagen 模型,而無需伺服器端 SDK。

請查看 firebase_ai 套件以了解新功能。如果您已經使用 firebase_vertexai 套件,它目前將繼續按原樣工作,但我們鼓勵您遷移到新的套件。

透過 AI 監控儀表板獲得可行的洞見

Firebase 控制台中的全新 AI 監控儀表板提供您 Gemini API 使用情況的詳細且可行的洞見。這包括全面了解消耗模式、效能指標和潛在問題。這能讓您做出資料驅動的決策,並確保您以最有效的方式使用 Gemini API。AI 監控還有助於您偵錯 Gemini API 的使用情況,並識別和解決任何非預期的行為。

重大變更與棄用

Android 輔助使用公告

在 Android 上,語義公告事件 從 API 36 開始已棄用。相反,請透過配置 SemanticProperties.liveRegion 來使用「禮貌」的隱式公告。目前,在公告不應獲得焦點的文字時存在一個已知限制。請參閱議題 #165857,以了解此限制的詳細資訊以及解決此問題的計畫。若要查看其他解決方案,請查看 SemanticService.announce 的文件

停用 6 個套件的支援

正如我們在 Flutter 3.29 版本部落格文章 中計畫和分享的,我們已停用以下套件的支援:

我們鼓勵社群成員參考每個議題中的討論以尋找替代方案。

iOS 和 macOS 最低版本

Flutter 將在下一個穩定版本中棄用對 iOS 12 和 macOS 10.14 (Mojave) 的支援,並將目標設定為最低支援 iOS 13 和 macOS 10.15 (Catalina)。這意味著使用未來 Flutter 版本建構的應用程式將無法在 iOS 12 或 macOS 10.14 上執行。

其他重大變更

此版本中的其他重大變更與棄用包括:

  • Material 中的 ExpansionTileController 已棄用,改用 Widget 層中新的可重複使用 ExpansibleController
  • SelectionChangedCause.scribble (已棄用) 已重新命名為 SelectionChangedCause.stylusHandwriting,因為 Apple 的 Scribble 功能現已與 Android 的 Scribe 統一。
  • 作為我們持續努力標準化 Material 主題的一部分,ThemeData.indicatorColor 已棄用,改用 TabBarThemeData.indicatorColor,而 cardTheme、dialogTheme 和 tabBarTheme 的組件主題類型則需要遷移到 CardThemeDataDialogThemeDataTabBarThemeData
  • 某些行為中的 SpringDescription 公式已更正。此變更解決了某些參數組合的行為與預期現實世界物理不符,並在臨界阻尼點附近表現出不連續性的問題。此變更會影響阻尼比小於 1 且品質值非 1 的欠阻尼彈簧。在此變更之前建立的此類彈簧在升級後可能會表現出不同的彈跳行為。要恢復之前的動畫行為,請根據 Spring Description Underdamped 重大變更指南 更新您的彈簧參數,您還可以在其中找到 一個工具,用於計算參數調整。

若要查看此版本中所有棄用或重大變更的遷移指南,請參閱 重大變更 頁面。更新後執行 dart fix 會自動為您遷移部分變更。

結論

Flutter 3.32 標誌著又一個向前邁進的步伐,這得益於我們社群令人難以置信的奉獻精神。我們很高興能為您帶來網頁熱重載等功能和持續的平台改進。您的貢獻是無價的,我們迫不及待想看看您會建立什麼。欲獲取全面概覽,請查看詳細的發行說明和變更日誌。要開始使用,只需執行 flutter upgrade 並深入了解最新版本!


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

【文章翻譯】Learn how to build agentic apps with Flutter, Angular, Firebase, and Vertex AI

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

我們建構應用程式的方式正在演變。想像一下應用程式不僅僅對使用者輸入作出反應,而是主動提供協助、自動執行任務並創造全新類型的體驗。歡迎來到 Agentic 應用程式 的世界!

今天,我們很興奮地宣布推出我們最新學習系列 Building Agentic Apps 的入門套件,該系列將於今天 2025 年 4 月 23 日至 5 月 14 日 舉行!這三週將提供新的資源、直播、問答,旨在讓 Angular 和 Flutter 開發人員有機會花幾個週末鑽研 AI 技術,並在此過程中了解 AI 的基礎建構區塊,知道何時何地運用它們,並建構一個值得展示的完整範例。

什麼是 Agentic 應用程式?

Agentic 應用程式包含由代理驅動的使用者體驗,代理是大型語言模型 (LLM)、目標以及實現目標所需的工具(例如 API 或函數)的組合。想像一下一個 Flutter 旅行應用程式,它不僅顯示目的地,還可以根據天氣預報和計劃的活動生成個人化打包清單,或者一個可以自動將您未讀郵件匯總為優先待辦事項清單的應用程式。有了代理,應用程式可以提供更多幫助,更主動,並且比以往任何時候都更容易使用。

為什麼現在?

因為現在正是認識最新 AI 工具並了解它們在哪裡可以(或不能)幫助您為使用者帶來價值的最佳時機。到三週結束時,您將建構出一個代理式體驗,並對術語、設計模式以及最適合 AI 的使用者歷程有很好的掌握,即使您是一名新的開發人員也是如此!

活動期間(4 月 23 日 - 5 月 14 日)預計內容:

  • 入門套件: 我們將發佈四個開放原始碼入門專案,供 Angular 和 Flutter 開發人員使用,將兩者與 Genkit 和 Firebase 中的 Vertex AI 結合。它們旨在為您提供易於理解、修改和重新利用的 Agentic 體驗結構。
  • 專家指導: 加入直播和線上活動,活動將邀請 Flutter 和 Angular 開發社群、Firebase 以及 Google AI 團隊的工程師。提出問題、觀看現場編程並學習最佳實踐。
  • 社群: 與其他開發人員聯繫、分享您的進度並查看社群建構了哪些驚人的內容。我們與 Google 的 Build With AI 系列合作,以確保他們的實體活動能夠存取新的資源。

立即開始!

立即前往 goo.gle/BuildingAgenticFluttergoo.gle/BuildingAgenticAngular 註冊。我們迫不及待想看看您會建構什麼!


學習如何使用 Flutter、Angular、Firebase 和 Vertex AI 建構 Agentic 應用程式 最初發佈在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

http://creativecommons.org/licenses/by/4.0/