Appfile For one Bundle Identifier
if you have one scheme and one bundle identifier this can be your Appfile Config

1
2
3
4
5
app_identifier("YOUR_APP_BUNDLE") # The bundle identifier of your app
apple_id("YOUR_DEVELOPER_ACCOUNT") # Your Apple Developer Portal username

itc_team_id("YOUR_ITUNES_CONNECT_TEAM_ID") # App Store Connect Team ID
team_id("YOUR_DEVELOPER_TEAM_ID") # Developer Portal Team ID

to get itc_team_id open https://appstoreconnect.apple.com/WebObjects/iTunesConnect.woa/ra/user/detail then search for contentProviderId .

Reference

【文章翻譯】Announcing Flutter 3.38 & Dart 3.10: Building the future of apps

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

嗨,Flutter 社群!我叫 Emma Twersky,我非常興奮能擔任 Flutter 和 Dart DevRel 的新負責人。我來這裡不僅是為了談論新功能,更是為了這個社群。我來這裡的首要原因是我們擁有的不可思議的文化。如果您還沒有閱讀過,請查看 Flutter 文化以及如何維護它。這一切都關乎開放、謙遜和尊重,同時構建出色的跨平台應用程式,這就是 Flutter 和 Dart 的全部意義。我非常高興能成為這個社群的一員,我迫不及待地想與大家分享我們正在努力的一切。

說到出色的跨平台應用程式,我們在 NotebookLM 的朋友今年憑藉他們的 Flutter 應用程式風靡一時。我們拜訪了他們,聽他們講述 Flutter 如何加速了他們的發布,請查看:

事實上,您可以在 NotebookLM 中收聽這篇部落格文章(及其所有連結來源)的音訊概述。

還在嗎?那麼請抓緊您的鍵盤,因為 Flutter 3.38 和 Dart 3.10 現已推出,它們非常火熱。這些版本包含了可用性增強和對我們開發者工具的改進。是的,這也包括 AI。

透過 Google AI 和「應用程式的未來」系列建構應用程式的未來

我們將在本月和下個月推出一系列 Flutter Flight Plans,向您展示如何使用 Flutter、Firebase 和 Gemini 建構下一代應用程式。

使用 Flutter GenUI 建構動態 UI: 新的 Flutter GenUI SDK 旨在幫助您建構基於使用者意圖的動態 UI。不相信我?觀看影片「GenUI 入門」,然後查看 genui 套件 以了解其運作方式。

建構 AI 最簡單的方法: 我們已經建構了一個由 Firebase AI 邏輯支援的範例應用程式,可幫助您為將 AI 功能整合到應用程式中建立一個好的起點。這個範例應用程式涵蓋了使用多模式內容生成以及 Gemini 對話式即時 API 等功能。在 Flutter AI Playground 中動手實作。

使用 Gemini CLI 建構多平台 Flutter 應用程式: 前往文件以跳轉到 Gemini CLI 的 Flutter 擴充功能。

生產力和平台能力:Flutter 3.38 和 Dart 3.10 有什麼新功能

現在是主要活動。以下是新功能以及您應該感到興奮的原因。

Dart 3.10 重點:更具表達性、簡潔和穩健的程式碼。

  • 點簡寫: 更少的打字,更多的程式碼。現在您可以直接寫 .start 而不是 MainAxisAlignment.start。查看 點簡寫 頁面以了解更多資訊。
  • 建構掛鉤: 現在穩定!直接使用您的 Dart 套件編譯原生程式碼或綁定原生資源。在 掛鉤 頁面中獲取所有詳細資訊,或觀看 建構掛鉤 影片。
  • 還有更多! 有一個新的 分析器 Plugin 系統。您可以使用此系統編寫自己的分析規則並使用 IDE 快速修復。使用新的 Deprecated 註釋 來棄用特定功能。

深入閱讀 Dart 3.10 技術部落格文章 以了解完整的故事。

Flutter 3.38 重點:更精緻的框架、更好的平台整合和更流暢的開發者工具。

  • 網頁增強功能: 我們為 flutter run 準備了一個 設定檔,支援代理,以及 網頁熱重新載入。因為誰有時間等待?
  • 框架和 UI: OverlayPortal 比以往任何時候都更強大,並且 預測性返回手勢 現在在 Android 上是預設的。我們也仍在完善 Material 和 Cupertino。
  • iOS 更新: 完全支援 iOS 26/Xcode 26、命令列部署,以及一個非常重要的 遷移 Flutter 應用程式指南
  • Android 更新: NDK r28 在這裡實現 16KB 頁面大小相容性,我們修復了一個主要的記憶體洩漏,並更新到 Java 17。
  • 工具: Widget 預覽工具 和 IDE 的重大更新。去玩吧!
  • 無障礙: 我們一直在努力讓 Flutter 更具包容性。向新的 SliverSemantics Widget 和更好的預設行為問好。

想要所有細緻入微的細節嗎?當然想。查看 Flutter 3.38 技術部落格文章

社群與生態系統焦點

在這個發布週期中,我們的社群一如既往地活躍,並提供了許多寶貴的貢獻。以下僅為幾個範例:

  • Windows 顯示屬性: 感謝 @9AZX,您現在可以在 Windows 上獲取詳細的顯示資訊,包括顯示器列表、顯示大小、刷新率和 DPI。
  • 新的便利建構函式: @ahmeddhus 加入了一個 SliverGrid.list 建構函式,為從 Widget 列表建立網格提供了更簡潔的 API。
  • 增強手勢處理: @houssemeddinefadhli81InkWell Widget 引入了 onLongPressUp 回呼,以專門處理長按手勢的釋放。
  • 更靈活的 Widget: @iamtoricoolBadge.count 建構函式加入了 maxCount 參數,@rkishan516CupertinoSlidingSegmentedControl 加入了一個瞬間變體。
  • 重要修復: 我們還看到了來自 @manu-sncf@yiiim 的滾動行為關鍵修復,來自 @romaingyh 的焦點問題,以及更多。

💙 老實說:這個社群就是一切。您是 Flutter 之所以成為今天這樣的原因,除了對 Flutter 核心的開源貢獻之外,您所創造的一切總是讓我們驚嘆不已。在此版本中,我們將重點放在 Kilian 和框架 Jaspr 上。如果說 Flutter 的網頁支援非常適合應用程式,那麼 Jaspr 是一個基於傳統 DOM(HTML/CSS)的網頁框架,它建構在 Dart 之上。當您想要一個基於 Dart 的解決方案來建構網站時,它是 Flutter 網頁的絕佳補充。

我們印象深刻,以至於我們將整個文件基礎設施(包括 dart.dev 和 docs.flutter.dev)都遷移到它上面。很酷,對吧?我們已請 Kilian 和團隊在未來的部落格文章中分享完整的故事,所以您很快就會聽到他們的聲音。同時,我們建議您 自己試試看

開始吧!

那麼,您還在等什麼?升級到 Flutter 3.38 和 Dart 3.10,讓我們一起共創未來。


宣布 Flutter 3.38 和 Dart 3.10:建構應用程式的未來 最初發佈在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

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

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

寫更少,看更多,建構更快

介紹

歡迎回到我們的定期季度發佈,Flutter 3.38。此更新旨在透過點符號簡寫和 Widget 預覽的更新來提高您的生產力並完善開發者體驗。感謝我們的社群,此版本總共包含來自 145 位獨特貢獻者的 825 次提交,其中 37 位是首次貢獻者。讓我們深入探討此版本中的內容。

點符號簡寫

撰寫更簡潔的 Dart 程式碼!我們很高興地宣布一項新的 Dart 功能——點符號簡寫!簡寫可以讓您省略 Dart 可以推斷的型別,從而減少樣板程式碼。

例如,您可以使用簡寫來撰寫 .start 而不是 MainAxisAlignment.start

1
2
3
4
5
6
7
8
9
10
11
12
13
// With shorthands
Column(
mainAxisAlignment: .start,
crossAxisAlignment: .center,
children: [ /* ... */ ],
),

// Without shorthands
Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: [ /* … */ ],
),

這也適用於具名建構函式!您可以撰寫 .all 而不是 EdgeInsets.all

1
2
3
4
Padding(
padding: .all(8.0),
child: Text('Hello world'),
),

此功能在 Dart 3.10 和 Flutter 3.38 中預設啟用。如需更多資訊,請查看 dart.dev 上的 點符號簡寫 頁面。您也可以在 Dart 3.10 發行部落格 文章中閱讀有關此內容及更多資訊(例如 Dart 鉤子!)。

網頁

網頁開發組態檔

flutter run 命令現在支援網頁設定的組態檔。這使您可以在專案根目錄的 web_dev_config.yaml 檔案中指定主機、埠、憑證和標頭資訊。將檔案提交到版本控制,以便您的團隊中的每個人都使用相同的設定進行除錯。如需更多資訊,請造訪 設定網頁開發組態檔

網頁開發代理設定

除了現有的命令列旗標之外,網頁開發組態檔還支援新的代理設定。代理設定可以將對配置路徑的請求轉發到另一個伺服器。這使得開發連接到相同主機上動態端點的網頁用戶端變得更容易。

有關代理設定的詳細資訊也在 設定網頁開發組態檔 中。

擴展網頁熱重載支援

當使用 -d web-server 運行並在瀏覽器中開啟 Flutter 應用程式的連結時,有狀態熱重載現在預設啟用。這甚至適用於同時連接多個瀏覽器。

-d chrome 一樣,此功能可以使用 --no-web-experimental-hot-reload 旗標暫時禁用。禁用此功能的能力將在未來的版本中移除,因此,如果您在開發工作流程中遇到問題,請使用 Dart 的 網頁熱重載問題範本 提交錯誤。如需更多資訊,請參閱 網頁熱重載文件

框架

此版本包含許多強大的新功能和框架改進,為開發人員提供對進階 UI、導航和平台互動的更精細控制。

開發人員現在在建立彈出視窗、對話框和其他浮動 UI 元素時擁有更大的權力,透過 OverlayPortal。現在可以使用 OverlayPortal.overlayChildLayoutBuilder (#174239) 在 Widget 樹中向上渲染任何 Overlay 中的子 Widget,從而更容易顯示應用程式範圍的通知或需要脫離其父 Widget 的佈局限制的其他 UI。底層的 Overlay.of 方法也變得更加健壯和高效 (#174315)。

為了獲得更現代的 Android 導航體驗,MaterialApp 中現在預設啟用預測性返回路由轉換 (#173860)。當使用者執行返回手勢時,他們現在會看到主螢幕的預覽,因為當前路由會動畫離開。此外,預設頁面轉換已從 ZoomPageTransitionsBuilder 更新為 FadeForwardsPageTransitionsBuilder,以反映原生行為。

此版本還深化了桌面整合。在 Windows 上,開發人員現在可以存取連接顯示器的列表,並查詢每個顯示器的詳細屬性,例如解析度、刷新率和實體大小 (#164460)。這使得能夠建立具有複雜視窗管理功能的應用程式。

最後,框架本身現在更具彈性。Widget 生命週期回呼中發生的錯誤(例如 didUpdateWidget)現在處理得更優雅,防止它們在元素樹中導致連鎖故障 (#173148)。ResizeImage 現在正確實作相等性,這透過確保相同的 ResizeImage 供應商被視為相同,使圖片快取和比較更具可預測性 (#172643)。

在網頁上,UI 優化持續進行,修復了 RSuperellipse 以防止當圓角半徑大於 Widget 本身時的渲染錯誤 (#172254),相反,這種情況將被處理以產生預期的藥丸形狀。

對於國際使用者,偵測瀏覽器偏好區域設定現在更為穩健。引擎現在使用標準的 Intl.Locale 網頁 API 來解析瀏覽器語言,取代了以前手動且更脆弱的實作 (#172964)。此變更導致更可靠的區域設定偵測和為全球受眾提供更好的體驗。

解決了一個 Android 特定的錯誤 (#171973),主要影響帶有硬體鍵盤的三星設備。以前,在使用者與 TextField 互動後,Android 輸入法編輯器 (IME) 可能會卡在過時狀態。這導致 IME 錯誤地攔截「Enter」或「Space」鍵盤按鍵,從而阻止非文字 Widget(例如 CheckboxRadio 按鈕)接收事件。此修復確保在文字連接關閉時 InputMethodManager 會正確重置,清除 IME 的過時狀態並恢復使用者可預測的硬體鍵盤互動。

Material 和 Cupertino 更新

Material 和 Cupertino 函式庫持續發展,專注於 API 一致性和優質使用者體驗。此版本帶來了主要的 API 遷移、新的 Widget 功能和眾多改進,使建構美觀、實用的 UI 更加簡單。

MaterialState 棄用的基礎上,此版本繼續內部遷移到更統一的 WidgetState。這提供了一種一致、富有表現力的方式來定義 Widget 在不同互動狀態(例如按下、懸停或禁用)下的外觀,並且對現有應用程式無需更改。此遷移已應用於各種 Widget 及其主題,包括 IconButtonElevatedButtonCheckboxSwitch (#173893)。新的 API 還增加了功能和靈活性;例如,IconButton 現在包含一個 statesController 屬性 (#169821),允許程式化控制其視覺狀態,為更多自訂和互動式設計開啟了大門。

此版本還引入了幾項新功能和便利的 API。Badge.count 建構函式現在包含一個 maxCount 參數 (#171054),可輕鬆限制顯示計數(例如,顯示「99+」而不是「100」)。

為了更精細的手勢控制,InkWell Widget 現在具有 onLongPressUp 回呼 (#173221),對於僅在使用者抬起手指時才應完成觸發動作非常有用。

Cupertino 函式庫也持續朝著更好的 iOS 保真度邁進。CupertinoSlidingSegmentedControl 加入了 isMomentary 屬性 (#164262),允許控制項觸發動作而不保留選取。為了更好地符合原生 iOS 行為,CupertinoSheet 現在在完全展開時向上拖動時具有微妙的「拉伸」效果 (#168547)。

最後,此版本充滿了優化,提升了核心組件的行為。重點包括修復 DropdownMenuFormField 以在表單重置時正確清除其文字欄位 (#174937),以及更新 SegmentedButton 以改進焦點處理 (#173953) 並確保其邊框正確反映 Widget 的狀態 (#172754)。

解耦 Material 和 Cupertino

我們一直在為將 Material 和 Cupertino 函式庫從框架中解耦做很多規劃。以下列表包含一些最近發佈的設計文件的討論。

改進 flutter/packages 的發佈流程,這將在解耦後包含 Material 和 Cupertino。

顏色和點符號簡寫

解耦測試

文字

捲軸:更健壯和可預測的 Sliver

此版本帶來了許多修復,使建立複雜的捲軸佈局,特別是那些使用 SliverMainAxisGroupSliverCrossAxisGroup 的佈局,更加健壯和可預測。

使用這些 Widget 組合多個 Sliver 的開發人員會發現手勢處理現在更可靠。這些群組中 Sliver 的點擊測試(用於點擊和其他指標事件)現在已正確計算,確保使用者互動行為符合預期 (#174265)。

其他幾項修復有助於在 SliverMainAxisGroup 中實現更精確的捲軸行為。使用固定標頭時的過度捲軸問題已解決 (#173349),調用 showOnScreen 以顯示 Sliver 現在可以正常工作 (#171339),並且內部捲軸偏移計算更精確 (#174369)。

對於建立自訂捲軸視圖的開發人員,新的 SliverGrid.list 建構函式 (#173925) 提供了從簡單子清單建立格線的更簡潔方式。

此版本還改善了複雜佈局中鍵盤和方向鍵使用者的焦點導航。在具有不同捲軸軸的巢狀捲軸視圖中(例如垂直的水平輪播列表),方向性焦點導航現在更具可預測性,防止焦點在各個區塊之間意外跳動 (#172875)。

無障礙功能:為所有使用者提供更具包容性的體驗

使應用程式對所有使用者都可存取是 Flutter 框架的基石。此版本透過為開發人員提供更多程式化控制、改善國際使用者的體驗以及優化核心 Widget 的無障礙功能來延續這一承諾。

對於開發複雜應用程式的開發人員,此版本引入了透過使用 WidgetsFlutterBinding.instance.ensureSemantics 在 iOS 上預設啟用無障礙功能的能力 (#174163)。現在除錯無障礙問題更容易了,因為 debugDumpSemanticsTree 包含了額外的文字輸入驗證結果資訊,以幫助更快地診斷問題 (#174677)。

對於基於 Sliver 的捲軸視圖中的高級無障礙功能,現在可以使用新的 SliverSemantics Widget (#167300)。就像現有的 Semantics Widget 一樣,開發人員可以在 CustomScrollView 中使用 SliverSemantics 來用特定語義資訊註釋其 Sliver 樹的一部分。這對於註釋標頭、分配語義角色以及為螢幕閱讀器向 Sliver 添加描述性標籤特別有用,為使用者提供更易於理解和存取的體驗。

最後,核心 Widget 的無障礙功能持續優化。CupertinoExpansionTile 現在預設可存取 (#174480),而 AutoComplete Widget 現在會向使用者宣布搜尋結果的狀態 (#173480)。其他改進,例如 TimePicker 中更大的觸控目標 (#170060),有助於提供更易於存取開箱即用的體驗。

iOS

我們很高興地確認 Flutter 完全支援最新的平台發佈:iOS 26、Xcode 26 和 macOS 26,所有這些都在 9 月發佈。這確保您可以立即開始在 Apple 最新的作業系統和工具上開發和測試您的應用程式。

您可能已經注意到 Flutter 上次發佈時為 iOS 開發人員帶來了顯著的生活品質改進,解決了一個長期以來困擾使用者的問題:在使用 flutter run 在實體設備上運行 Flutter 應用程式時,需要自動啟動 Xcode 應用程式。我們引入了一種新的部署方法,使用 Xcode 26 命令列工具 devicectl 進行應用程式安裝、啟動和除錯。此過渡消除了在部署期間調用 Xcode 應用程式的需要,並且在大多數情況下僅依賴於命令列 Xcode 建構工具。如果您遇到問題,您可以使用 flutter config --no-enable-lldb-debugging 禁用此部署方法,並請 提交問題 讓我們知道!

以前,此功能依賴於 Xcode 自動化,但在 Xcode 26 上變得不穩定且不可靠,尤其是在運行連續命令時。如果您現在正在為最新的 Apple 版本進行開發,我們強烈建議您將 Flutter 版本更新到 3.38 或更高版本。

UIScene 生命週期遷移

Flutter 3.38 包含了對 Apple 強制執行的 UIScene 生命週期 的基本支援。這是 Apple 在 WWDC25 上宣布之後的一項關鍵、主動更新:「在 iOS 26 之後的版本中,任何使用最新 SDK 建構的 UIKit 應用程式都將需要使用 UIScene 生命週期,否則它將無法啟動。」

為了確保您的 iOS Flutter 應用程式在未來的 iOS 版本中保持相容並成功啟動,需要進行遷移。

遷移 Flutter 應用程式

所有現有的 iOS Flutter 應用程式都必須遷移到新的生命週期。您有兩種方法來完成此遷移:

  1. 手動遷移:遵循 Flutter 網站 上提供的手動遷移說明。
  2. 自動遷移(實驗性):啟用實驗性功能以自動處理遷移。這將在未來的版本中預設啟用。執行以下命令:
1
flutter config --enable-uiscene-migration

遷移 Flutter Plugin

依賴應用程式生命週期事件的 Flutter Plugin 必須更新為使用 UIScene 生命週期事件。Plugin 開發人員應參考 遷移指南。未遷移的 Plugin 將在未來的版本中顯示警告。

遷移嵌入式 Flutter(可選)

對於將 Flutter 嵌入原生主機應用程式的專案,遷移是可選的但強烈建議。使用 應用程式遷移指南 採用 Flutter 的新 UIScene API,可以為您的 Plugin 啟用場景生命週期事件,確保與 Flutter 生態系統的相容性。

Android

16KB 頁面大小相容性

升級到 Flutter 3.38 是為 Google Play 的 16 KB 頁面大小相容性要求 做準備的必備條件。從 2025 年 11 月 1 日 開始,針對 Android 15 及更高版本的應用程式必須支援 16 KB 頁面。此更改確保您的應用程式在高 RAM 設備上正常運行,提供性能優勢,例如啟動速度提高 30%。Flutter 3.38 將預設 Android ndkVersion 更新為 NDK r28,這是原生程式碼實現 16 KB 支援的正確對齊所需的最低版本。

記憶體修復

Flutter 3.38 修復了 一個影響所有 Android 上的 Flutter 應用程式的嚴重記憶體洩漏。該問題(在 3.29.0 中引入)發生在 Activity 在退出時被銷毀時,如開發人員設定所配置或當 Activity 因記憶體不足而被系統殺死時。

Android 依賴項更新

通常,要找出適用於您的應用程式的 Android 依賴項的正確版本組合(包括 Gradle、Android Gradle Plugin (AGP)、Kotlin Gradle Plugin (KGP)、Java 等)可能是一個挑戰。對於 Flutter 3.38 版本,我們在我們的持續整合 (CI) 環境中測試並確認了以下 Android 依賴項版本的相容性:

  • Java 17:Flutter 3.38 中 Android 開發所需的最低版本。
  • KGP 2.2.20:工具鏈 已知和支援 的最大 Kotlin Gradle Plugin 版本。
  • AGP 8.11.1:與 KGP 2.2.20 相容 的最新 Android Gradle Plugin 版本。
  • Gradle 8.14:此版本與選定的 Java、KGP 和 AGP 版本配合使用。請注意,Gradle 8.13 是 AGP 8.11.1 所需的最低版本。

為了確保您的應用程式在 Flutter 版本之間無縫運作,我們強烈建議您在建構檔案中使用 Flutter SDK 提供的 API 等級變數。此版本配置的值為:

  • flutter.compileSdkVersion (API 36)
  • flutter.targetSdkVersion (API 36)
  • flutter.minSdkVersion (API 24) 或更高

引擎

效能疊加層

效能疊加層已重構,使其在 Skia 和 Impeller 後端上都更高效,減少了其渲染時間。這表示您可以使用更少的開銷獲得更準確的效能資料。(#176364)

Vulkan 和 OpenGL ES

Vulkan 和 OpenGL ES 後端的多項修復和改進提高了在更廣泛設備上的穩定性和效能。這包括更好地處理管道快取 (#176322)、柵欄等待器 (#173085) 和圖片佈局轉換 (#173884)。

渲染器統一

統一 CanvasKit 和 Skwasm 渲染器的工作仍在繼續。此版本包含重要的重構,以在兩者之間共享更多程式碼,這將在未來帶來更一致的體驗和更快的開發 (#174588)。

執行緒合併

已從 iOS 和 Android 中移除選擇退出執行緒合併的功能。如需更多資訊,請查看 大執行緒合併 影片。

DevTools 和 IDE

實驗性 Widget 預覽 — 更新

Flutter 3.35 引入了 Widget 預覽,這是一個實驗性功能,可供社群早期回饋。Flutter 3.38 版本對 Widget 預覽帶來了顯著改進,包括:

  • IDE 整合:我們的 VSCode 和 Intellij / Android Studio Plugin 都已更新,並初步支援 Widget 預覽。您現在可以直接在 IDE 中查看預覽,以獲得更流暢的開發體驗。
Widget Previews embedded in VSCode.

在 IDE 中使用時,Widget 預覽環境預設配置為根據當前選定的原始程式檔篩選顯示的預覽:

  • Widget 預覽環境主題和控制改進:Widget 預覽環境現在支援淺色和深色模式,以及自訂 IDE 顏色方案以符合您的開發環境。Widget 預覽環境中的控制項也已調整為使用更少的空間,為渲染預覽留下更多空間。
Custom theming support for the Widget Previews environment.
  • 預覽可擴展性Preview 註解類別不再標記為 final,現在可以擴展以建立自訂 Preview 註解,從而減少常見預覽類型的樣板程式碼。
An example of a custom BrightnessPreview annotation.
  • MultiPreview 支援:新的 MultiPreview 基礎類別允許從單個自訂註解建立多個預覽變體。
  • 預覽群組Preview 類別中的新 group 參數允許將相關預覽分組。
An example of multiple “Brightness” previews in a preview group.
  • 減少 @Preview 註解引數的限制:私有常數現在支援作為 Preview 註解的引數。函式引數(例如 wrapper 和 theme)仍然需要具有公共、靜態可存取的名稱。

Widget 預覽仍是一個實驗性功能,您的回饋對於塑造其未來至關重要。API 和使用者體驗尚不穩定,將隨著我們從您那裡學習而改變。

根據早期回饋,計劃進行更多增強功能以改善 Widget 預覽體驗,包括:

  1. Flutter DevTools Widget Inspector 支援:Widget Inspector 正在更新以支援檢查 Widget 預覽環境中的預覽。我們計劃將 Inspector 直接嵌入 Widget 預覽器中,使其無論您的開發環境如何都易於存取。
  2. IDE 中的多專案支援:Widget 預覽器目前僅支援顯示單個專案或 Pub 工作區中包含的預覽。我們正在積極研究支援具有多個 Flutter 專案的 IDE 會話的選項(議題 #173550)。
  3. 啟動效能改進:正在調查效能改進的機會,以減少初始啟動時間,包括:
  • 首次運行後啟動預編譯的 Widget 預覽環境
  • 並行化預覽偵測邏輯以更好地處理大型專案

要開始使用,請查看文件並告訴我們您的想法!

重要提示:已知 Widget 預覽器在 flutter pub get 後可能會崩潰或停止更新。如果您遇到此問題,請在您的專案中運行 flutter pub get 並重新啟動您的 IDE。請參閱 #178317 了解詳細資訊。

DevTools 更新

Flutter 3.38 包含了對 2025 年 DevTools 使用者調查中使用者提出的主要痛點的一些修復,包括:

網路面板改進

  • 使面板記錄網路流量的時間更容易理解。(#9495)
  • 修復了複製貼上網路請求的問題。(#9472#9482#9485#8588)

Flutter Inspector 修復

  • 修復了選取 Widget 有時會開啟底層框架原始碼而不是使用者原始碼的錯誤。(#176530)
  • 修復了偶爾阻止與 Inspector 面板頂部按鈕互動的錯誤。(#9327)

棄用和重大變更

此版本包含幾個重要的棄用和重大變更,作為持續努力現代化和改進 Flutter 框架的一部分。

已進行了主要的建構和工具鏈更改,這可能會影響自訂建構指令碼。Flutter SDK 根目錄下的版本檔案已移除,取而代之的是位於 bin/cache 中的新 flutter.version.json 檔案 (#172793)。此外,AssetManifest.json 檔案不再預設生成 (#172594)。

其他值得注意的更改包括:

  • 為實現更可預測的行為,包含動作的 SnackBar 將不再自動關閉 (#173084)。
  • OverlayPortal.targetsRootOverlay 建構函式已棄用,取而代之的是更靈活的 OverlayPortal(overlayLocation: OverlayChildLocation.rootOverlay)
  • CupertinoDynamicColor 上的幾個屬性,例如 withAlphawithOpacity,現在已棄用,取而代之的是標準的 Color 方法 (#171160)。
  • Flutter 3.38 要求 Java 17 作為 Android 的最低版本,與 Gradle 8.14(2025 年 7 月發布)的最低要求相符。

有關這些和其他變更的更多詳細資訊和遷移指南,請查看 重大變更頁面

結語

Flutter 3.38 專注於讓您的日常開發更快、更愉快。這些增強功能旨在簡化您的建構方式。我們非常感謝為此版本做出貢獻的每位社群成員的辛勤工作和回饋。

有關所有更改的完整列表,請務必查看詳細的重大變更和發行說明。要免費提升您的生產力,只需運行 flutter upgrade


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

【文章翻譯】Announcing Dart 3.10

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

宣布 Dart 3.10

今天,我們很高興地宣布 Dart 3.10 發布!

宣布 Dart 3.10

此版本持續專注於改進核心開發者體驗。新的 點語法縮寫 (**) ** 功能將幫助您編寫更具可讀性且不那麼冗長的程式碼。我們還引入了一個功能強大的新 分析器外掛系統,允許您建立直接整合到 IDE 中的自訂靜態分析規則。我們很高興地宣布 構建鉤子 現在已經穩定!

此版本還為 pub.dev 和套件管理帶來了多項改進。您將在個人資料的 「喜歡」選項卡 中找到新的搜尋功能,套件作者現在可以 禁用手動發布 以提高安全性。最後,我們新增了一套新的、更具體的 棄用註釋,讓您可以更精細地控制 API 的演進。

繼續閱讀以了解有關這些以及 Dart 3.10 中其他改進的更多資訊。

語言更新

點語法縮寫 🆕

Dart 3.10 引入了 點語法縮寫 (.). 這個新功能讓您可以省略冗餘的類別或枚舉名稱,因為編譯器可以從語境中推斷類型。

讓我們來看一個常見的場景:日誌記錄。以前,您可能已經寫過:

1
2
3
4
5
6
7
8
enum LogLevel { info, warning, error, debug }

void logMessage(String message, {LogLevel level = LogLevel.info}) {
// ... implementation
}

// Somewhere else in your app
logMessage('Failed to connect to database', level: LogLevel.error);

由於 level 參數已經預期 LogLevel,重複枚舉名稱是沒有必要的。使用點語法縮寫,您現在可以這樣寫:

1
2
3
4
5
6
7
8
enum LogLevel { info, warning, error, debug }

void logMessage(String message, {LogLevel level = .info}) {
// ... implementation
}

// Somewhere else in your app
logMessage('Failed to connect to database', level: .error);

程式碼現在專注於「值」(.error),而不是「類型」(LogLevel)。

點語法縮寫不僅適用於枚舉。您還可以將它們用於構造函數、靜態方法和靜態字段。要了解更多資訊,請閱讀我們的 點語法縮寫 指南。

工具更新

分析器外掛 🆕

您是否曾經在審查程式碼時想過,「分析器應該能夠捕捉到這個錯誤吧?」現在它可以了。

Dart 3.10 引入了一個功能強大的 Dart 分析器新外掛系統。這允許您編寫和使用自己的靜態分析規則,這些規則直接整合到 IDE 和命令行工具中,例如 dart analyzeflutter analyze。您可以使用 分析器外掛 來:

  • 強制執行專案特定的規則,例如專門的 lint 和警告,以維護團隊程式碼庫中的約定。
  • 避免您領域中常見的陷阱和最佳實踐。
  • 透過提供快速修復和協助來自動化程式碼更改,以幫助自動糾正問題或遷移到新的 API。

這個新系統是為實現一個豐富的社區驅動工具生態系統而進行的重大架構努力的結果,我們特別感謝社區貢獻者 Felipe Morschel 對分析器的一般性寶貴修復和功能。

要使用分析器外掛,只需將其添加到您的 analysis_options.yaml 文件中:

1
2
3
4
analyzer:
plugins:
- some_plugin
- another_plugin

要了解有關建立自己的自訂規則的更多資訊,請參閱 編寫分析器外掛 的文件。

構建鉤子 🚀

將原生程式碼(如 C++、Rust 或 Swift)整合到 Dart 套件中通常需要管理複雜的、平台特定的構建文件,如 CMake 或 Gradle。在 Dart 3.10 中,這個過程現在大大簡化了。

我們很高興地宣布 構建鉤子 (以前稱為原生資產) 現在已經穩定。您可以使用這些鉤子來編譯原生程式碼或下載原生資產(如動態庫),並將它們直接與您的 Dart 套件捆綁在一起。這個強大的功能讓您可以在套件中重用現有的原生程式碼或函式庫,並消除了為不同作業系統編寫單獨構建文件(如 SPM、Gradle 或 CMake)的需要。

要了解更多資訊,請參閱 編寫構建鉤子 的文件,或觀看有關構建鉤子的 Flutter Build 節目片段

移除棄用 lint 🆕

當您發布套件的新主要版本(例如 1.0.0 或 0.2.0)時,最佳做法是移除您之前標記為棄用的任何 API。這會使您的套件保持乾淨,並防止開發人員使用過時的程式碼。但是,在發布過程中很容易忘記此步驟。

為了提供幫助,我們引入了一個新的 lint:remove_deprecations_in_breaking_versions。當套件的版本更新到新的主要破壞性版本時,此 lint 會檢測剩餘的棄用元素。透過標記這些情況,lint 有助於確保您的套件 API 保持現代化,並讓您的使用者易於理解。

remove_deprecations_in_breaking_versions lint 範例

@Deprecated 註解 ⬆️

現有的 @Deprecated 註解是一個粗略的工具。它通知開發人員不再推薦使用 API,但它不允許細微的差別。例如,您如何表示一個類別不應再擴展,但仍然可以實例化?

為了讓套件作者對其 API 的演進有更精確的控制,Dart 3.10 引入了一套新的、更具體的棄用註解。

您現在可以棄用類別和 mixins 的特定使用案例:

此外,您現在可以使用 @Deprecated.optional() 表示可選參數在未來版本中將成為必需參數。

Pub 更新

搜尋、排序和取消喜歡您最愛的套件 🆕

在 pub.dev 上管理您最愛的套件剛剛獲得了重大升級。您可以透過搜尋功能或個人資料上的 「喜歡」選項卡 來完成此操作,您現在可以使用與常規搜尋相同的熟悉控制項來搜尋、排序和篩選您喜歡的套件。這包括按喜歡數、pub 點數和熱門程度排序。我們還改進了取消喜歡套件的 UI,讓您比以往更輕鬆地保持喜歡的套件列表整潔和最新。

在您的「喜歡」選項卡中搜尋、排序和取消喜歡您最愛的套件

如果您選擇使用搜尋功能搜尋您喜歡的套件,只需將 is:liked-by-me 加入到您的查詢中。

搜尋,但只包含您喜歡的套件

啟用或禁用手動發布 🆕

為了增強安全性和防止意外發布,您現在可以禁用套件的手動發布(pub publish)。這對於具有自動發布工作流程或不再積極發布的套件來說是理想的選擇。

透過禁用手動發布,您可以防止使用個人憑證更新套件,從而降低未經授權或意外發布的風險。

您可以在套件的「管理」選項卡中使用「啟用手動發布」核取方塊來控制此功能。

在「管理」選項卡中啟用或禁用手動發布

總結

Dart 3.10 版本帶來了一系列改進,重點關注開發人員生產力、工具以及套件生態系統的整體健康狀況。從使程式碼更簡潔的點語法縮寫等語言功能,到分析器外掛和穩定的構建鉤子等強大的新工具功能,我們希望此版本能讓您能夠構建出更好的應用程式。

我們非常感謝為此版本做出貢獻的許多工程師和團隊,特別感謝我們的社群貢獻者,他們幫助 Dart 變得更好。

我們很高興看到您使用 Dart 3.10 構建什麼。要開始使用,您今天就可以獲取 Dart 3.10 SDK。有關所有新功能和更新功能的完整列表,請查看 Dart SDK 變更日誌


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

【文章翻譯】Google Summer of Code 2025 Results

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

Google Summer of Code 2025 成果

Google Summer of Code (GSoC) 計劃旨在讓全球的新開發者參與開源軟體開發。Google 贊助貢獻者在夏季與指導開源組織合作進行為期 12 週的程式設計專案。在過去的 20 年中,超過 20,000 名貢獻者參與了 Google Summer of Code。

2025 年,Dart 連續第六年作為指導組織參與 Google Summer of Code。今年,我們收到了來自世界各地潛在參與者超過 100 個專案提案。今天,我們將重點介紹今年夏天我們指導的一些專案。貢獻者在這篇文章中描述了他們的專案。

自訂 iOS 上下文選單項目

作者:Jing Shao

行動應用程式開發的一個關鍵目標是提供真正的原生體驗。在這個專案之前,iOS 上的 Flutter 應用程式有一個主要限制——開發者無法將自訂操作加入到原生 iOS 上下文選單中。在 GSoC 2025 期間,我成功地為 Flutter iOS 實作了自訂上下文選單支援,這顯著增強了 Flutter 應用程式在 iOS 上的互動能力。

這個專案建立了新的 IOSSystemContextMenuItemCustom API,允許開發者透過 TextFieldcontextMenuBuilder 屬性輕鬆地將自訂操作加入到原生 iOS 選單中;開發者可以加入帶有自訂標題和回呼的選單項目。實作將 Flutter 與原生 iOS UIMenu 系統橋接起來,確保自訂項目與標準 iOS 選單選項(複製、貼上)無縫整合,同時保持原生外觀和感覺。

有了這項改進,Flutter 開發人員現在可以建立更具表現力和功能豐富的應用程式。這項工作標誌著 Flutter 在提供出色的跨平台原生體驗方面向前邁出了重要一步,為開發人員提供了強大的工具來建立出色的應用程式。有關更多詳細資訊,請查看我在 GitHub 上的技術部落格和 PR。如有任何問題,請隨時與我們聯繫!我要感謝我的導師 JustinHuan 在整個專案中提供的寶貴指導和支援。

以下是一個範例,顯示了 清除文字加入愛心 ❤️大寫 等自訂選單項目與原生上下文選單中的標準 iOS 選單項目並列。

Dart TUI 框架

作者:Gedion Ezra

在這個專案之前,想要建立互動式終端應用程式的 Dart 開發人員通常必須轉向 Rust、Go 或 Python。Dart 中沒有成熟的基於文字的使用者介面 (TUI) 框架,這限制了開發人員只能使用 GUI 或靜態 CLI 工具。作為 GSoC 2025 的一部分,我們建立了 Pixel Prompt,這是一個受 Flutter 宣告式、基於元件的方法啟發的終端 UI 框架。Pixel Prompt 允許開發人員完全在 Dart 中建立動態互動式應用程式。

Pixel Prompt 引入了 Component 到 ComponentInstance 模型,其靈感來自 Flutter 的分層架構,將 Widget(在 Widget 層)映射到 Element 層,然後再映射到 RenderObject 層。Component 宣告式地描述 UI,而 ComponentInstance 管理狀態佈局和渲染。請查看簡化版的架構:

該框架支援有狀態和無狀態組件、輸入處理以及使用雙緩衝和 ANSI 差異化優化的渲染。這透過最大限度地減少終端重繪來提高性能,並透過虛擬終端解釋器實現可靠的黃金測試。

為了直觀地了解 Pixel Prompt 可以實現的功能,下面提供了一些演示的螢幕截圖。這些演示了框架支援的宣告式佈局、互動式元件和即時更新,顯示 Dart 現在無需離開其生態系統即可為完全互動的終端應用程式提供動力。

儘管 Pixel Prompt 已經能夠建立核心終端應用程式,但還有更多功能:支援複雜組件(如 TextAreaTables)、類似 flex 的佈局系統、專用的動畫 API 和視覺偵錯器都已計劃在未來貢獻。感興趣的開發人員可以在 pixel_prompt 儲存庫上探索未解決的問題並作出貢獻。

TestGen — 基於 LLM 的測試生成工具

作者:Amr Ahmed

TestGen 是一個實驗性專案,旨在自動化 Dart 的單元測試生成,其主要目標是透過生成專門針對程式碼庫中未覆蓋行的測試案例來提高測試覆蓋率。透過利用大型語言模型 (LLM) 生成有意義的測試,TestGen 減少了手動編寫測試所需的工作量,幫助開發人員實現更高的覆蓋率並提高程式碼品質。

使用 LLM 進行自動化測試生成的主要挑戰之一是決定向模型提供多少程式碼上下文。例如,如果一個函數需要測試,我們提供整個文件作為上下文,LLM 可能會不堪重負並產生不相關或不準確的測試。如果我們只提供函數本身,模型可能會遺漏函數內部的重要依賴項,導致測試不完整或損壞。為了解決這個問題,TestGen 使用 Dart 分析器將整個程式碼庫解析為 宣告,這些宣告是表示程式碼建構(如函數、變數、類別或 Mixin)的類別。解析後,它會建立這些宣告之間的依賴圖,這精確地顯示了給定宣告所依賴的程式碼片段。這是透過遍歷給定宣告的抽象語法樹 (AST) 並在訪問期間記錄其依賴項來完成的。使用此圖,TestGen 可以僅向 LLM 提供相關上下文(上下文感知提示),且深度可配置,幫助它生成準確且專注的測試,而無需額外噪音。

該圖顯示了給定 Dart 檔案生成的依賴圖。在測試 toBeTestedFunction 時,該圖幫助我們輕鬆檢索要包含在提示中的所有相關上下文。LLM 現在可以更好地理解該函數及其周圍環境,從而實現更有效和準確的測試生成過程。

為了使測試生成有效,TestGen 與 package:coverage 整合,以自動檢測程式碼中尚未測試的部分並針對這些部分。該工具透過 package:google_generative_ai 連接到 Gemini 模型使用 gemini-2.5-progemini-2.5-flashgemini-2.5-flash-lite 等變體來生成測試案例。然後,這些測試會經過驗證和回饋循環,在此期間它們會被執行並檢查錯誤。如果發現問題,錯誤會回饋到 LLM 中,以便它可以改進輸出,使最終測試更加準確和可靠。

這個套件還有更多內容,包括新功能、改進的測試和增加對 Flutter 專案的支援。您可以在 dart_testgen repo 上查看目前的問題列表。有關生成提示的範例,請參閱 default-prompt 範例。有關該專案的更多詳細資訊,請參閱完整的 GSoC 報告

LLM 驅動的 Android (Java/Kotlin) 文件翻譯成使用 JNIgen 綁定的 Dart

作者:Marshelino Maged

Android 函式庫和工具通常以 Java/Kotlin 程式碼片段記錄。儘管 JNIgen 可以為這些函式庫生成 Dart 綁定,但由於語言之間語法和結構上的差異,針對綁定編寫 Dart 程式碼可能具有挑戰性。這意味著開發人員無法直接重複使用官方 Android 文件和教學課程中找到的許多 Java/Kotlin 範例。native_doc_dartifier 專案旨在透過自動將 Android 文件中的 Java 和 Kotlin 片段翻譯成其 Dart 等效物來解決此差距。

範例 Java 片段。
範例片段翻譯。

該專案建立在 JNIgen 之上,JNIgen 透過外部函式介面 (FFI) 為 Java 和 Kotlin API 生成 Dart 綁定。因為 Java 和 Dart 在語法和語義上都存在差異,所以直接翻譯是不夠的。例如,Java 支援方法重載,而 Dart 不支援,這導致 JNIgen 使用重命名方法(例如 add$1add$2)來消除綁定歧義。為了生成準確的 Dart 程式碼,翻譯模型必須考慮這些綁定慣例,而不是依賴表面級別的轉換。

一個主要技術挑戰是規模:Android 函式庫的綁定通常包含數十萬行的 boilerplate 程式碼,遠遠超出即使是最大的語言模型(目前為 1M token)的輸入限制。為了解決這個問題,該專案引入了 抽象語法樹 (AST) 提取,它將綁定縮減到其公共 API 表面——結果約為原始大小的 6% ——同時保留了關鍵資訊。這與 檢索增強生成 (RAG) 相結合,其中每個類別的 AST 分開儲存,並且僅根據正在翻譯的程式碼片段檢索最相關的類別。

透過將 AST 提取與基於檢索的上下文選取 相結合,native_doc_dartifier 能夠生成既準確又與生成的綁定保持一致的 Dart 翻譯,同時在 LLM 上下文限制內保持高效。其結果是一個實用解決方案,可減少 Dart 開發人員處理 Android 文件時的摩擦,並加強 Java/Kotlin 和 Flutter 生態系統之間的互操作性。

由於翻譯由 LLM 生成,因此在編譯生成的 Dart 程式碼時偶爾會發生錯誤。為了提高可靠性,系統整合了一個回饋循環:編譯錯誤會回傳給 LLM 進行多次迭代,允許它細化和更正翻譯,直到生成一個可用的版本。這種迭代方法進一步增加了生成範例的穩健性。

欲了解更多資訊,請造訪 native_doc_dartifier 儲存庫。

將 TS 宣告翻譯成 Dart JS 互操作介面

作者:Nikechukwu Okoronkwo

Dart 透過 dart:js_interop 提供與 JavaScript 的強大互操作性,可用於與用 JavaScript 編寫的程式碼進行介面。然而,為大型函式庫和套件編寫綁定可能耗時且容易出錯。為了解決這個問題,我們建立了 JS 互操作生成器。它會自動從 TypeScript 宣告檔案 (.d.ts) 生成 Dart 包裝器。這有助於 Dart 在 Web 上的採用,並允許 Dart 和 Flutter 開發人員更輕鬆地利用來自 NPM 和其他地方的龐大 JS 函式庫生態系統。

該生成器的工作原理是解析 .d.ts 檔案,並將其 TypeScript 宣告轉換為其 Dart 等效項。這些宣告是根據 Dart 與 JS 互操作的方式生成的,確保在與 TS 宣告程式碼所代表的 JS 程式碼的互操作實現方面正確無誤,並且在可能的情況下盡可能接近 TS 宣告對程式碼的表示。

它支援廣泛的 TS 功能,包括變數、函數、列舉、類別、介面、命名空間和型別別名。該生成器生成 TS 型別的等效 Dart 表示,並在可能的情況下利用 dart:js_interoppackage:web 中的現有型別。這包括支援高級 TypeScript 功能,如匿名物件、匿名閉包、聯合、合併型別以及 typeof / keyof

您可以在 整合測試套件 中看到許多範例。我們已經成功使用生成器為諸如 nanoiduuid 等流行套件建立綁定。有關此內容的更多詳細資訊,請參閱 生成器測試結果

該專案位於 web repo 中的 web_generator 套件中。您可以透過執行 bin/gen_interop_bindings.dart 腳本來試用它。如果您遇到任何問題或錯誤,請隨時提交問題和/或作出貢獻!


Google Summer of Code 2025 成果 最初發佈於 Dart 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

【文章翻譯】Meet the Flutter Extension for Gemini CLI

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

透過新的 Gemini CLI Flutter 擴充功能,建置高品質、功能豐富的應用程式

今天,我們很高興分享 Gemini CLI Flutter 擴充功能 的第一個實驗版本,它結合了 Dart 和 Flutter MCP 伺服器 與額外的上下文和命令,使使用 Gemini CLI 建置 Flutter 應用程式變得更容易、更有效率。

AI 代理正在改變我們建置 Flutter 應用程式的方式,透過協助處理功能原型設計、程式碼審查以及編寫和執行測試等任務。為了有效使用 AI 代理,您需要為其提供上下文和工具存取權限,以幫助它成為一個高效的 Flutter 程式碼助理。這就是 Gemini CLI Flutter 擴充功能的作用。Gemini CLI 擴充功能 允許您使用 Gemini CLI 和您的工具建置整合,而 Flutter 擴充功能則建立在這些功能之上。

Gemini CLI 的 Flutter 擴充功能提供了加速應用程式開發的命令,遵循明確的規則來編寫遵循 Dart 和 Flutter 最佳實踐的高品質程式碼,並運行 Dart 和 Flutter MCP 伺服器中的工具來直接存取 Dart 和 Flutter 的開發人員工具。您可以花費更少的時間在設定上,而將更多的時間花在建置高品質的 Flutter 應用程式上。

實際操作

首先,使用以下命令安裝擴充功能:

1
gemini extensions install https://github.com/gemini-cli-extensions/flutter

Gemini CLI 的 Flutter 擴充功能隨附一組命令,可幫助您完成開發的關鍵階段。以下是一些最常見的命令及其使用方式:

  • /create-app:為 Gemini 建立設計文件和實作計畫。
  • /modify:建立一個對應用程式進行重大更改的計畫。
  • /commit:分析和測試程式碼,修復所有發現的問題,然後將更改提交到 Git。

若要了解如何設定和使用 Gemini CLI 擴充功能的更多資訊,請遵循 GitHub 儲存庫 中的說明。

建立應用程式

您可以使用 /create-app 命令建立新的應用程式。此命令會啟動一個全新的、可投入生產的 Flutter 應用程式。它超越了 flutter create,會詢問您的應用程式用途,設定建議的 Linter 規則,並在編寫任何程式碼之前產生詳細的 DESIGN.mdIMPLEMENTATION.md 檔案供您審閱。

1
/create-app
使用 /create-app 命令建立應用程式

DESIGN.md 檔案是應用程式的設計文件;它指定了應用程式解決的問題,並提供了有關其如何運作的技術細節。您可以在繼續實作步驟之前編輯此檔案,讓您可以引導 Gemini 建立您正在尋找的確切應用程式。

一旦設計準備就緒,/create-app 會產生一個 IMPLEMENTATION.md 檔案,這是一個逐步實作計畫,以便它可以疊代地處理功能實作。它會記錄其進度,因此您可以暫停和重新開始。預設情況下,/create-app 會將計畫分成 3-5 個階段,每個階段都是一個邏輯停止點。每個階段結束後,Gemini 都會分析和格式化程式碼、執行測試並提交變更。它還會在完成日記部分中的階段後更新此檔案。

實作計畫中的功能

設定專案後,您就可以使用產生的 IMPLEMENTATION.md 檔案實作實作計畫中的功能。每個功能都將按照此檔案中的概述單獨實作。一旦完成實作功能,Flutter 擴充功能會將其標記為已完成。

在進入下一個階段之前,擴充功能會要求您批准。您可以輸入提示「看起來不錯」以開始產生程式碼:

引導式實作計畫使 Gemini CLI 保持在正軌

修改

若要更改現有程式碼,/modify 命令會啟動一個引導式開發會話。它會詢問您的目標,提供建立新分支,並產生一個 MODIFICATION_PLAN.md 設計文件,概述建議的修改和分階段的實作計畫。

1
/modify
使用 /modify 命令為 Gemini 建立詳細的修改計畫

清理並提交

最後一步是使用 /commit 提交更改。此命令會在您使用 Git 提交更改之前準備您的更改。它會自動執行 dart fixdart format,運行分析器和測試,然後根據更改生成一個描述性提交訊息供您批准。

使用 /commit 命令清理並準備程式碼以進行提交

搭載最佳實踐

每個互動式聊天會話都包含適用於 Flutter 和 Dart 開發的最佳實踐規則。這些規則確保 Gemini 編寫高品質的 Dart 和 Flutter 程式碼,正確地與 MCP 伺服器工具互動,並遵循最佳實踐,例如建立單元測試、編寫文件、確保可訪問性等等。

擴充功能包含規則和最佳實踐

使用 Flutter 和 Dart MCP 伺服器存取開發工具

當您安裝 Gemini CLI 的 Flutter 擴充功能時,Dart 和 Flutter MCP 伺服器會自動配置。這允許 Gemini CLI 和其他 AI 代理執行常見的開發任務:

  • 分析和修復專案程式碼中的錯誤
  • 內省並與您正在運行的應用程式互動(例如觸發熱重載、取得選定的 Widget、獲取運行時錯誤)。
  • 在 pub.dev 上搜尋 適用於您用例的最佳套件。
  • 管理pubspec.yaml 檔案中的套件依賴項。
  • 執行測試 並分析結果。
  • ……以及更多!
MCP 伺服器提供 Gemini CLI 存取 Dart 和 Flutter 開發工具

試用看看

我們希望您試用 Gemini CLI 的 Flutter 擴充功能並分享您的回饋。

查看 GitHub 上的 Flutter 擴充功能 以了解更多資訊。如果您有建議或遇到問題,請 提交議題。我們迫不及待想看看您會建立什麼!


認識 Gemini CLI 的 Flutter 擴充功能 最初發佈於 Flutter on Medium,人們在那裡透過突出顯示和回應這個故事來繼續對話。

【文章翻譯】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 平台,人們在該平台繼續透過標註和回應此故事來進行對話。