【文章翻譯】Announcing Dart 3.11

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

好的,請注意,我將以繁體中文輸出 Markdown 格式的內容:

宣布 Dart 3.11

各位 Dart 開發人員您好!最新的穩定版 Dart 3.11 正式發布了!

此版本著重於響應能力和工具改進,您將在日常工作流程中感受到這些變化。從更智慧的分析伺服器到新的 pub 客戶端功能和增強的 AI 支援,Dart 3.11 旨在讓您保持流暢。繼續閱讀以了解更多資訊。

宣布 Dart 3.11

語言更新

此 Dart 版本中沒有新的語言更新。

工具更新

Dart MCP 和 AI 支援:套件 URI

我們將繼續改進 Dart 和 Flutter MCP 伺服器,以更好地支援 AI 編碼助手。

我們在 MCP 伺服器中新增了一個名為 read_package_uris 的工具。此工具允許 AI 代理(如 Cursor、Gemini 或 Copilot)從您的專案中讀取套件 URI 並將其添加到其上下文。這確保您的 AI 助手在產生程式碼時可以正確讀取、解析和利用相依性。

分析伺服器

此版本包含 Dart 分析伺服器的多項效能改進。伺服器現在使用「細粒度相依性」,使其在決定 IDE 會話期間需要重新分析哪些程式碼時更智慧。

我們還改進了特定情況下的分析效能,例如分析由符號連結導致的目錄結構中存在循環的程式碼,或許多常數物件的深層樹。

伺服器現在會快取編譯過的分析器插件入口點,從而縮短 IDE 會話以及 dart analyzeflutter analyze 命令的啟動時間。

最後,我們增強了許多分析伺服器功能中的「點式簡寫」支援,特別是程式碼補全、快速修復和快速協助。

Pub 更新

Pub 工作區中的 Glob 支援

Pub 工作區 現在支援使用 glob 宣告套件。這使您可以輕鬆地將目錄中的所有套件包含在 pub 工作區中,而無需一一列舉:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Before
name: workspace
environment:
sdk: ^3.10.0
workspace:
- pkg/a
- pkg/b
- pkg/c
# After
name: workspace
environment:
sdk: ^3.11.0
workspace:
- pkg/* # Adds all packages inside pkg.

注意:要使用此功能,您的 pubspec.yaml 必須具有 Dart 版本 3.11 或更高版本。

Pub 快取垃圾回收

Pub 始終將套件儲存在一個單一的全局 PUB_CACHE 中,確保您永遠不會下載相同的套件兩次。然而,由於 Pub 沒有追蹤哪些專案使用了快取,因此無法知道哪些套件已過時,導致套件版本隨著時間的推移而累積。到目前為止,唯一的解決方案是清除整個快取並重新開始。

從 Dart 3.9 開始,pub get 已將解析的專案路徑儲存在快取中。現在在 Dart 3.11 中,我們引入了 pub cache gc 命令,該命令遍歷所有「活動」專案,標記它們所依賴的所有套件版本,並刪除其餘的。這可以幫助您回收寶貴的磁碟空間。

1
2
3
4
5
6
7
8
9
10
> dart pub cache gc
Found 3 active projects:
* /home/yourusername/projects/pub
* /home/yourusername/projects/pub-dev
* /home/yourusername/projects/pana
All other projects will need to run `dart pub get` again to work correctly.
Will recover 2 GB.
Are you sure you want to continue? (y/N)? y
Deleting unused cache entries... (4.5s)
>

總結

Dart 3.11 就這樣!此版本完全著重於在日常開發中產生影響的細節。

有關完整的變更列表,請查看 Dart SDK 變更日誌。一如既往,我們很樂意聽取您的回饋!


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

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

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

賦能社群

今天,我們很高興地宣布發布 Flutter 3.41,這標誌著我們共同旅程中的一個轉型里程碑!對於開發者來說,這是一個多麼令人興奮的時代;此版本代表了我們致力於賦能社群塑造 Flutter 方向的承諾。Flutter 3.41 包含來自 145 位獨特貢獻者的 868 次提交,提供了額外的透明度和模組化,以進一步改善對 Flutter 的貢獻體驗。

我們正在引入公開發布窗口,讓您更容易了解您貢獻的變更何時會發布到穩定版本。我們還將繼續解耦我們的設計函式庫,這從長遠來看將幫助我們更快地發展設計系統,同時也讓您可以控制在應用程式中採用哪些設計變更。無論您是透過新的片段著色器改進來突破 GPU 的極限,還是使用內容大小的視圖將 Flutter 無縫嵌入到現有的原生應用程式中,此版本都能確保您擁有自信和快速構建的工具。

有太多值得探索的內容,讓我們深入了解…

結構透明度和模組化

公開發布窗口

可預測性是安全地實現複雜功能的關鍵。我們正在引入公開發布窗口,為整個社群提供規劃所需的能見度。透過公開明確地指出分支截止日期和發布目標,我們使整個社群能夠清楚地了解他們的變更何時會發布到未來的穩定版本。

那麼什麼是分支截止日期?這個日期是拉取請求提交到預設分支(Dart 為 main,Flutter 為 master)的截止日期,以保證包含在下一個穩定版本中。如果您的 PR 在截止日期之前合併,它將在下一個穩定版本中發布。如果它在截止日期之後合併,它將等待下一個週期。

2026 年,我們計劃發布四個穩定版本(包括此版本),日期如下:

  • Flutter 3.41 — 2 月 | 1 月 6 日分支
  • Flutter 3.44 — 5 月 | 4 月 7 日分支
  • Flutter 3.47 — 8 月 | 7 月 7 日分支
  • Flutter 3.50 — 11 月 | 10 月 6 日分支

解耦以實現更精簡的核心

我們正在繼續將 Material 和 Cupertino 函式庫遷移到獨立套件的專案。這種模組化方法有幾個優點:

  • 更快的發布週期: 我們不再需要等待每季的 SDK 發布才能發布設計更新。我們可以在新的 Material 或 Cupertino 功能和錯誤修復準備就緒時立即發布。
  • 獨立升級: 如果您由於專案限制而使用舊的 SDK 版本,您仍然可以升級您的設計套件以獲得最新的外觀和感覺。
  • 自適應設計: 版本化的套件使我們能夠在 iOS 或 Android 引入 drastic 設計轉變(例如「液態玻璃」或「Material 3 Expressive」)時更快地做出反應,確保您的應用程式永不過時。

請關注 GitHub 議題 以追蹤進度。

擁抱生態系統標準

賦能社群的一部分是確保 Flutter 與我們已經依賴的工具良好協作。

Swift Package Manager 和 UIScene

從 CocoaPods 到 Swift Package Manager 的過渡仍在繼續。我們強烈鼓勵 Plugin 作者 採用 Swift Package Manager,因為它現在是 Apple 生態系統的標準。此外,為確保與未來 iOS 版本的相容性,Flutter 現在 預設完全支援 UIScene 生命周期。此更新對於滿足 Apple 對即將推出的 iOS 版本的需求至關重要。為了簡化從已棄用的 AppDelegate 生命周期邏輯的遷移,請查看我們的 遷移指南

Android Grade Plugin (AGP) 9 和 Kotlin DSL

我們持續與現代 Android 標準保持一致。隨著 Android Gradle Plugin (AGP) 9 的發布,我們正在努力支援新的嚴格要求並提供如何應對這些要求的指導。

警告: 請勿 將您的 Flutter Android 應用程式更新到 AGP 9,因為 將 Plugin 遷移到 AGP 9 和在 AGP 9 上使用 Plugin 的 Flutter 應用程式 尚未支援 (#181383)。此支援已暫停,因為 Flutter 團隊正在審核遷移以確保與舊版本 AGP 的向後相容性。此 遷移文件 將隨著指導變更而更新。

感謝社群成員 Byoungchan Lee (bc-lee@) 的貢獻,新的 Plugin 專案現在預設使用 Gradle 的 Kotlin DSL。

平台特定資產

由於 Alex Frei (hm21@) 的努力,優化現在變得更容易。您現在可以在 pubspec.yaml 中指定資產應捆綁哪些平台。這允許進行優化,例如,從行動建置中排除大型桌面資產,從而顯著減小應用程式大小。

1
2
3
4
5
6
7
flutter:
assets:
- path: assets/logo.png
- path: assets/web_worker.js
platforms: [web]
- path: assets/desktop_icon.png
platforms: [windows, linux, macos]

傾聽社群的聲音

Google 的 Flutter 團隊持續優先考慮對您最重要的事項。

入門體驗

多年來,社群一直指出,雖然 Flutter 令人愉悅且高效,但很難知道從何開始學習。

我們最近推出了完全重新構想的 Dart 和 Flutter 入門體驗

這是一個新的學習途徑,旨在引導您了解使用 Flutter 和 Dart 構建應用程式的基礎知識。讓我們快速瀏覽一些變更:

  • 我們引入了一個新的「快速安裝」指南,該指南利用網頁上的熱重載,使學習者能夠快速體驗 Flutter 的全部功能,而無需首先設定特定於平台的環境。這是一個包含書面教學、低風險測驗以及 Google Flutter 團隊中一些熟悉的面孔的八個新影片的途徑。
  • 學習者將在完成學習路徑後從頭開始構建 4 個應用程式。

在我們網站上重新設計的 學習 部分中嘗試新的入門體驗,該部分由 Jaspr 提供支援。

片段著色器改進

在 2025 年第四季度,我們調查了使用 FragmentShader API 的開發人員,並簡單地問道:是什麼阻礙了您的工作? 您告訴我們,您在使用 API 時需要改進人體工學,同時在定義著色器時擁有更大的靈活性。為此,我們進行了以下變更:

  • 在 3.41 中,我們加入了同步圖片解碼。以前,為著色器建立紋理可能會引入一幀延遲。使用 decodeImageFromPixelsSync,您現在可以在同一幀中生成紋理並將其用作取樣器。
  • 我們還加入了對高位元速率紋理(高達 128 位元浮點)的支援,解鎖了使用高解析度查找表 (LUT) 進行 GPU 加速照片濾鏡和 SDF 的能力。
1
2
3
4
5
6
7
8
9
10
11
12
void attachTexture(ui.FragmentShader shader) {
ui.PictureRecorder recorder = ui.PictureRecorder();
Canvas canvas = Canvas(recorder);
canvas.drawCircle(const Offset(64, 64), 64, Paint()..color = Colors.red);
ui.Picture picture = recorder.endRecording();
ui.Image image = picture.toImageSync(
128,
128,
targetFormat: ui.TargetPixelFormat.rFloat32,
);
shader.setImageSampler(0, image);
}

Widget 預覽(實驗性)

根據您的早期回饋,我們正在快速疊代 Widget 預覽。在此版本中,Widget 預覽得到了以下改進:

  • Flutter Inspector 支援: Widget 預覽環境現在可以存取嵌入式 Flutter Inspector 實例,使檢查佈局和預覽 Widget 的狀態變得容易。重要提示: 預設情況下,可能需要配置額外的套件目錄才能看到專案中的 Widget。為此,請點擊齒輪圖標打開 Flutter Inspector 設定,並添加一個指向您專案的新套件目錄。
  • 支援具有 dart:ffi 依賴項的應用程式: 以前,包含具有 dart:ffi 函式庫傳遞依賴項的 Widget 預覽會導致編譯錯誤並阻止預覽環境更新。發生這種情況是因為 dart:ffi 不支援 Web 平台 (flutter/flutter#166431)。Widget 預覽器現在可以處理對平台特定函式庫(包括 dart:ffidart:io)具有依賴項的預覽。重要提示:在 Widget 預覽器中不支援調用這些函式庫的 API,並且將導致針對調用這些平台特定 API 的預覽顯示錯誤。有關如何撰寫與原生和 Web 平台都相容的程式碼的範例,請參閱 Dart 條件導入文件

框架保真度和優化

我們持續專注於平台保真度和開發人員效率,以改進當前的體驗。

iOS 優化

在 Flutter 3.41 中,我們透過新的「有界模糊」風格對視覺效果進行了改進。以前,使用 BackdropFilter 的半透明 Widget 可能會出現邊緣顏色滲出的問題。由於 Impeller 渲染引擎的改進,我們已經消除了這種假影。

我們還透過 showDragHandle 屬性為 CupertinoSheet 加入了原生風格的拖曳處理支援。

添加到應用程式

現在將 Flutter 視圖添加到現有的 Android 和 iOS 應用程式中變得更容易了!嵌入在現有原生應用程式中的 Flutter 視圖現在可以根據其內容自動調整大小。以前,Flutter 視圖需要由其原生父級提供固定大小。這使得某些情況變得困難,例如將 Flutter 視圖添加到原生可捲動視圖中。

要使用此功能,您的根 Widget 必須支援無界約束。避免在樹的頂部使用需要預定義大小的 Widget(例如 ListView 或 LayoutBuilder),因為它們將與動態大小調整邏輯衝突。

要在 iOS 上啟用此行為,請 FlutterViewController.isAutoResizable 設定為 true。對於 Android,請在您的 Android Manifest 中啟用內容大小調整,並 將您的 FlutterView 的寬度或高度設定為 content_wrap

導航和捲軸

我們努力透過以下變更來消除核心互動模型中的粗糙邊緣:

  • 我們引入了 Navigator.popUntilWithResult,允許您在單一呼叫中彈出多個螢幕並將值傳回目的地路由,大大簡化了多步驟流程中的狀態管理。
  • 我們使用從 Android 12 移植的基於模擬的方法重新實現了 StretchingOverscrollIndicator。這確保了更自然流暢的過度捲軸效果,可正確回應高速滑動。
  • 我們修復了 NestedScrollViewSliverMainAxisGroup 中固定標題的問題,確保標題正確覆蓋後續的 sliver。

無障礙

幫助您建立無障礙體驗,讓使用者在任何螢幕上都能使用,是我們使命的核心。在此更新中,我們加入了以下內容:

  • CircularProgressIndicatorLinearProgressIndicator 的原生無障礙支援,允許輔助技術宣布進度更新。
  • Flutter 現在尊重網頁使用者的文字間距覆蓋,以改善閱讀體驗。
  • 我們在 flutter_test 中引入了新的匹配器,例如 isSemanticsaccessibilityAnnouncement,以使驗證無障礙變得更容易。

Material 和動畫

我們引入了新的原始類型和屬性,以擴展對動畫和佈局的控制。感謝社群成員 Bernardo Ferrari (bernaferrari@) 的努力,RepeatingAnimationBuilder 引入了一種宣告式的方式來創建連續動畫,例如載入指示器、脈衝按鈕或閃爍的佔位符效果。

例如,您可以這樣製作一個方塊來回滑動:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
RepeatingAnimationBuilder<Offset>(
animatable: Tween<Offset>(
begin: const Offset(-1.0, 0.0),
end: const Offset(1.0, 0.0),
),
duration: const Duration(seconds: 1),
repeatMode: RepeatMode.reverse,
curve: Curves.easeInOut,
builder: (BuildContext context, Offset offset, Widget child) {
return FractionalTranslation(
translation: offset,
child: child,
);
},
child: const ColoredBox(
color: Colors.green,
child: SizedBox.square(dimension: 100),
),
),

我們還更新了 CarouselView,增加了 .builder 構造函數,讓建立動態內容的輪播變得更容易。DropdownMenuFormField 現在支援自訂的 errorBuilder,並且 RawAutoComplete 現在包含 OptionsViewOpenDirection.mostSpace 選項,可以根據可用的螢幕空間智能地定位選項。

社群主導的演進

Flutter 開源夥伴關係最強大的範例之一是我們與 Canonical 的長期關係。他們的團隊持續推動 Flutter 桌面的發展藍圖,提供造福整個生態系統的關鍵功能。

感謝 Canonical 的工程領導,我們正在彌補複雜桌面 UI 需求方面的差距。此版本引入了用於創建彈出視窗和工具提示視窗的實驗性 API,以及對 Linux、macOS 和 Windows 上對話框視窗的跨平台支援。最後,增加了新的 API,讓您可以測試多視窗應用程式。如果您想先睹為快這些即將推出的視窗 API,請查看 Flutter 的 multiple_windows 範例應用程式

Flutter Linux 現在也預設啟用合併執行緒,簡化了執行緒模型並提高了效能,同時也致力於提高 Windows 的穩定性。我們打算在未來的版本中移除合併執行緒選擇退出。如果您對合併執行緒有任何問題,請 告知我們

DevTools

Devtools 在效能和穩定性方面都有所改進:

  • Flutter 的 DevTools 使用 dart2wasm 編譯,從而提高了效能。您仍然可以選擇退出並恢復到 dart2js 編譯的 DevTools,方法是使用設定對話框。
  • 與 Dart Tooling Daemon (DTD) 的斷開連線現在會自動重試,以改善機器休眠後恢復時的體驗。

這些只是此版本中的幾個亮點。若要了解 Flutter 3.41 中包含的所有更新,請查看 DevTools 2.52.02.53.02.54.0 的發行說明。

下一步:flutter upgrade

Flutter 3.41 是朝著改善我們的開源貢獻體驗邁出的一步,同時也改善了 Flutter 的基礎功能,以增強您的開發體驗,無論您是將插件遷移到 Swift Package Manager,為特定平台優化資產,還是使用新的 Shader API 推動像素。我們感謝我們共同建立的精彩社群。

有關所有變更的完整列表,請務必查看詳細的 重大變更發行說明。要試用 Flutter 3.41 中的新功能,只需運行 flutter upgrade


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

【文章翻譯】Announcing our new Dart and Flutter Getting Started experience

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

當我加入 Dash DevRel 團隊時,我的經理給了我一份入職文件,開頭是這樣的:「你新工作的宗旨只有一句話:改善 Dart 和 Flutter 開發者的生活。」

久而久之,我逐漸了解到「Dart 和 Flutter 開發者」的定義也包含了那些尚未稱自己為 Dart 和 Flutter 開發者的人;他們只是對 Flutter 感到好奇。

今天,我們推出了一個我們認為可以改善這些未來 Flutter 開發者生活的事物:Dart 和 Flutter 入門體驗

我們建造了什麼

入門體驗是一條為尚不了解 Dart 或 Flutter 的程式設計師設計的多學科學習路徑。它涵蓋 Dart 和 Flutter 網站,並結合了書面教學、影片系列、測驗和文件,引導您從設定 Flutter 到建立一些旨在教授基本原理的應用程式。

為那些只想試用 Flutter 的人提供的快速安裝指南。

自從 Hot Reload 在網路上發布以來,Flutter 學習者可以在不需要下載特定平台的開發環境的情況下,獲得完整的 Flutter 體驗。我們編寫了一份新的快速安裝指南,以減少嘗試 Flutter 的阻力。我們不希望在您甚至開始之前,就讓您感覺像是一種承諾!

兩個完整的教學課程:一個用於 Dart,一個用於 Flutter。

Dart 教學課程旨在引導到 Flutter 教學課程,但它們之間並無依賴關係。如果您已經熟練使用另一種現代、物件導向的語言,您可以直接跳入 Flutter 教學課程。

您將從零開始建構的四個應用程式。

在我們自問的所有設計問題中,我們花費最多時間思考的是讀者將實際建構什麼。它會是一個巨大的應用程式,幾個獨立的食譜式 Flutter 程式碼片段,還是介於兩者之間的東西?

最終,我們得出結論,較小的應用程式能為初學者提供更好的體驗,原因有以下幾點:

  • 對於較大的應用程式,出錯的空間更大,這可能會讓初學者感到沮喪。
  • 應用程式越大,需要的程式碼就越多,而這些程式碼實際上與教學課程試圖教授的內容無關。
  • 我們不希望要求使用者複製一個包含 25 個專案的儲存庫,其名稱類似於 flutter_tutorial_step_1。然後您必須將 Git 和終端命令引入其中,您必須要求讀者複製適用於其作業系統的命令,依此類推。這只是一堆不必要的累贅,阻礙了學習。

同時,應用程式必須超越單一功能,否則我們將無法將功能與更大的圖景聯繫起來。

八部影片伴隨主要主題。

入門體驗中的影片旨在提供最關鍵的上下文,以便讀者在進入實作程式碼部分時,能理解他們正在做什麼。

包含這些影片對我個人而言也很重要。多年前當我學習 Flutter 時,我對早期的 DevRel 團隊感到敬畏。他們深切關心 Flutter 的教學,而且他們是如此真誠和支持,以至於我想成為他們正在做的一切的一部分。由於這個學習路徑通常是新的 Flutter 開發者第一次互動的東西,我想尊重這種感覺,並讓對 Flutter 好奇的開發者感到興奮和歡迎加入社群。

為此,我們利用這些影片來教學 Flutter,同時也介紹了一些每天都在努力讓 Flutter 和 Dart 變得更好的真實人類——工程師、技術撰寫人員和產品經理都參與其中。

整個過程中有小測驗,以確認您所學到的知識。

我們在每個教學頁面末尾加入了簡單的測驗。它們風險低且不具阻擋性。它們僅僅是為了給您一點回饋和信心。如果您不喜歡它們,就跳過它們吧!

現有的「Flutter 如何運作」YouTube 系列作為結論。

我們以 Craig Labenz 幾個月前發布的精彩影片系列「Flutter 如何運作」作為學習教學的結尾。這個系列以足夠的深度教導您 Flutter 的內部運作,使其仍然易於理解,同時提升您編寫 Flutter 應用程式的能力。這是成為一名進階 Flutter 開發者必學的知識。

網站更新

這份教學文件將與 Dart 和 Flutter 網站的幾項更新一起發布。您可能知道我們一直在將我們的網站基礎設施從基於 JavaScript 的靜態網站產生器 (SSG) 遷移到 Jaspr,一個 Dart SSG。這次遷移的時機並非偶然!我們知道我們想這樣做,而且在我們開始對入門教學文件進行網站的大量更新之前,這似乎是正確的選擇。

作為讀者,最明顯的更新是將主要文件文章與網站的學習區塊分開。網站的學習區塊是透過點擊網站標頭導航中的「學習」按鈕來存取的,如螢幕截圖所示:

「學習」區塊將組織所有現有和未來的教學式文件和文章,以使主要文件更容易導航。在標頭導航中,可以透過「使用者指南」按鈕(或點擊網站標題)到達主要文件。

嘗試看看

學習路徑已在 docs.flutter.dev/learn/pathway 上線。如果您完整閱讀了它——或者只是其中一部分——請填寫該頁面上連結的回饋調查。我們正在傾聽,並且已經在思考接下來要做什麼。


宣布我們新的 Dart 和 Flutter 入門體驗 最初發表於 Flutter on Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

【文章翻譯】Jaime’s build context: Prompt engineering as infrastructure

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

總結

在代理式人工智慧時代,專案規模擴展的瓶頸已從程式碼量轉移到程式碼完整性。若要在人工智慧所允許的速度下前進,同時不引入系統性摩擦,我們必須停止將人工智慧視為魔杖,而應將其視為需要完美校準軌道的高效能引擎。

  • 縮小差距:工程團隊正在分裂——一端是傳統主義者,另一端是高速的代理式超級使用者。對於生產應用程式,您的基礎架構必須連接兩者,創建一個共享空間,讓傳統的嚴謹性和代理式速度不僅共存,而且積極地相互強化。
  • 傾向於可重現的系統:代理程式的好壞取決於其回饋迴路。如果您的測試不可重現,並且您的 CI 缺乏高訊號回饋迴路,那麼您的代理程式將會盲目運行。
  • 將提示視為基礎架構:停止將您最好的 AI 指令視為當會話結束時就會消失的臨時聊天一次性內容。相反,將這些自動化工作流程指令移到版本控制檔案中,將您的個人部落知識轉化為可執行文件,確保每個團隊成員都能在整個專案中可靠地觸發相同的高完整性結果。
  • 轉向基於技能的架構:成功意味著將您經過驗證的工作流程晉升為共享技能。透過從單個提示轉向專案範圍的技能,您為整個團隊提供了一個標準的、高完整性的劇本,代理程式可以自動執行。

最近,我一直在反思,對於新一批貢獻者來說,擴展開源專案的真正意義是什麼。我們正在進入一個代理式人工智慧可以如此快速地生成程式碼的時代,以至於純粹的數量不再是瓶頸;相反,真正的挑戰是確保這種湧入不會損害我們的程式碼庫,或我們作為隊友的共同價值觀。許多團隊正在分裂成啞鈴形狀:一端是傳統的手動編碼,另一端是高速的代理式超級使用者。

對於大型應用程式來說,我們的基礎設施必須作為連接這兩個極端的手柄,創造一個共享空間,讓傳統的嚴謹性和代理式速度不僅共存,而且積極地相互強化。為了有效擴展,我們必須透過將我們的工作流程建立在可重現軟體開發的基礎上來堅持基礎。為了在這些工具允許的速度下前進,而不會陷入技術債務或難以閱讀的程式碼庫,我們的環境必須提供明確、高訊號的回饋迴路。

在這種代理式情境下,原始碼健康狀況嚴格以通過測試、確定性覆蓋率指標和乾淨的分析來衡量。如果缺少這些基本要素,就像要求高效能引擎在黑暗中以極快的速度行駛一樣。如果環境尚未準備好,感覺需要抵制這些新工具是完全合理且通常是負責任的。

這裡的目標不是為了速度而將工具強加於專案;而是建立數位感測器,使我們能夠安全地採用新的速度。更重要的是,這種轉變是關於讓我們的隊友一起參與。基礎設施不應該是將「AI 超級使用者」與團隊其他成員分開的障礙;它應該是我們所有人都感到自信的共同點。在代理式時代成為一名好隊友意味著確保儘管我們的儲存庫可能移動得更快,但我們的文化仍然支持。我們建立這些系統是為了讓每個人都能自信地前進,確保「代理式速度」對整個團隊來說都是一項勝利,而不僅僅是現有功能軟體產品的新風險。

然而,這些數位感測器的可靠性取決於它們所處的環境。這就是為什麼我們必須將信任建立在 CI 系統中。在真正可重現的工作流程中,CI 是唯一重要的現實版本;它是缺乏人類直覺的代理程式的最終仲裁者。如果變更未能通過自動化閘門,它實際上就不存在。透過將 CI 視為高訊號回饋迴路,我們消除了手動驗證的人為瓶頸,並將其替換為可重現的閘門。這種絕對的真相來源使我們能夠更負責任地擴展——使代理程式能夠快速失敗、迭代,並最終成功,而不會損害專案的完整性或團隊的安心。

請求

一次性的提示成功只是僥倖。真正的規模化來自於創造一個飛輪:每次您或隊友回到儲存庫時,代理程式都應該比上次更有能力,因為知識債務已預付到共享的提示儲存庫中。您正在建立一個不會被困在單一開發人員腦中的共享機構記憶。

為了讓您團隊中的任何開發人員都能重複使用此功能,您需要一個提示指令函式庫,充當可執行文件。雖然許多團隊急於創建全域「config」和「rules」檔案,但我發現這些通常會導致結果不一致——代理程式可能會「忘記」規則或將其錯誤地應用於錯誤的情境。作為具有科學頭腦的工程師,我們應該更喜歡消除變數。透過控制特定任務的確切提示,您可以確保代理程式擁有該特定任務在您的儲存庫中所需的確切內容。以有意的方式在專案中這樣做有助於個人和團隊對這些新工具建立真正的信心。

進入代理技能

2025 年末,Anthropic 推出了 Agent Skills ——一個開放標準,旨在為 AI 代理提供專業的模組化專業知識。技能不僅僅是通用工具,它還將指令和資源打包在一起,以確保複雜任務的一致執行。這正在迅速發展;截至 2026 年初,許多工具已經開始支援此標準,以實現跨平台可移植性。

  • 彈性:您可以將技能與許多代理程式搭配使用,包括 Antigravity、Cursor、Claude Code Gemini CLI 和 VS Code,因為它們是 開放標準
  • 共享知識:技能可以輕鬆地與協作者共享,或儲存到使用者資料夾中以供跨專案使用。
  • 可重複的工作流程:技能透過清晰的程序步驟指導代理程式,確保代理程式一致地執行複雜的多步驟任務。
  • 其他資源:技能可以包含腳本、範本或除了指令之外的其他資料。
  • 即時存取:當技能首次載入時,只有中繼資料會載入到代理程式的上下文中。這意味著只有在需要時才會將特定指令添加到上下文中,從而節省了令牌。
  • 維護程式碼品質:這些技能的建構可以用作一組工具,幫助貢獻者獲得正確的上下文,以根據您的最佳實踐組合出更高品質的 PR、測試和文件。

當前支援技能的主要工具文件

請參閱您的工具文件以了解在哪裡添加這些檔案。

有效技能的構成

為了確保您的技能函式庫仍然是「機器人的操作手冊」,而不僅僅是建議清單,此集合中的每個提示都遵循一套嚴格的最佳實踐:

  • 已知良好狀態:在代理程式接觸任何程式碼之前,它必須驗證現有的測試是否通過且分析器是否乾淨。如果基礎破裂,代理程式會在其上構建之前修復基礎。
  • 可操作的驗證:將指令錨定在 flutter test --coveragedart fix --apply 等命令中,以向代理程式提供自我修正所需的確定性回饋。
  • 有限的範圍設定:為了確保代理程式保持高度的上下文和專注,提示的設計具有明確的界限——針對特定函數、檔案或覆蓋率差距。這確保代理程式專注於單一目標,防止範圍蔓延並確保輸出易於審查。
  • 報告和審查迴路:代理程式的工作以結構化摘要結束,而不是提交。透過要求代理程式解釋其變更並提供建議的提交訊息,而不是實際推送程式碼,我們將人類工程師保留在最終決策者的角色中。

範例技能:準備當前工作以供 PR

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
---
name: pr-prep
description: Prepare current work for PR
---
## 準備當前工作以供 PR:驗證測試通過並清理

**目標:** 使用 `flutter test` 驗證當前測試套件狀態,清理任何臨時修改,並加強活動檔案的測試覆蓋率。

**指令:**
1. **基準:**
* 執行 `dart fix --apply` 以應用自動修復。
* 執行 `flutter analyze` 以確保沒有分析問題。
* 執行 `flutter test` 以建立當前通過狀態。
* 執行 `flutter test integration_test/app_test.dart` 以驗證整合完整性。
2. **修復失敗:** 如果有任何測試失敗或分析錯誤,請調查並解決它們。優先修復程式碼而不是刪除測試。
3. **清理:** 審查任何當前修改的檔案(執行 `git status` 或檢查差異)。移除任何:
* `print` / `debugPrint` 語句。
* 未使用的導入。
* 註釋掉的程式碼塊。
* 應替換為正確解決方案的臨時「駭客」修復。
4. **驗證和擴展:**
* 對於您修改或清理的檔案,檢查其單元測試是否缺少明顯的邊緣情況。添加測試以涵蓋這些情況。
* 再次執行 `flutter analyze` 以確保程式碼乾淨。
* 再次執行 `flutter test` 以確保清理沒有破壞任何東西。
* 根據需要重複此步驟。
5. **報告和審查:**
* 總結清理狀態(例如,「測試通過,已移除 3 個 debug print」)。
* **行動:** 要求使用者仔細審查變更,以確保沒有意外刪除預期的程式碼。
* **不要提交或推送。**
* 提供建議的 Git 提交訊息(例如,「準備 PR:修復測試並移除 debug 程式碼」)。

範例技能:單檔測試覆蓋率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
---
name: single-file-test-coverage
description: Write a new test or modify an existing test
---
## 單檔測試覆蓋率改進

**目標:** 撰寫新的單一測試檔案,或修改現有檔案,以改善特定目標類別的覆蓋率。

**指令:**
1. **識別目標:** 選擇 `lib/` 中具有低或無測試覆蓋率且適合單元測試的單一原始碼檔案 (Dart)(例如,實用程式類別、邏輯輔助函數)。
3. **建立基準:**
* 執行 `flutter analyze` 以確保有效性。
* 執行 `flutter test` 以確保專案穩定。
* 執行 `flutter test --coverage` 並檢查 `coverage/lcov.info`。
4. **實作/更新測試:** 在 `test/` 中建立新的測試檔案或更新現有檔案。專注於:
* 邊緣情況(空輸入、空字串、邊界值)。
* 分支覆蓋率(確保 if/else 路徑已執行)。
* 必要時模擬依賴項(使用 `mockito` 或 `mocktail`)。
5. **驗證與迭代:**
* 執行測試以確保它們通過。
* 執行 `flutter analyze` 以確保沒有回歸。
* 如果覆蓋率仍然很低,**請迭代幾次**:分析遺漏的行/分支並添加有針對性的測試案例。
5. **報告與審查:**
* 總結已修復/覆蓋的內容並報告覆蓋率進度(例如,`X% -> Y%` for `<filename>`)。
* **行動:** 要求使用者仔細審查新的測試。
* **不要提交或推送。**
* 提供建議的 Git 提交訊息(例如,「改進 [類別名稱] 的測試覆蓋率」)。

範例技能:遷移到現代 Dart 功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
---
name: migrate-to-modern-dart-features
description: Migrate to modern Dart features (Dart 3+)
---
## 遷移到現代 Dart 功能

**目標:** 透過遷移到現代 Dart 功能(Dart 3+)來優化一致性和簡潔性。

**可遷移的候選者:**
* `if-else` 鏈 -> `switch` 表達式。
* 具有手動 `==`/`hashCode` 的資料類別 -> `Records` 或 `equatable`(或類別修飾符)。
* 空檢查 -> 模式匹配。

**指令:**
1. **基準:** 執行 `flutter test` 和 `flutter analyze`。
2. **選擇目標:** 識別 *單一* 遷移機會。
3. **限制:** 將變更保持極小(**最多 50 行**)。
4. **遷移:** 重構以使用新功能。
5. **驗證:**
* 執行 `flutter analyze`。
* 執行 `flutter test` 以確保沒有回歸。
6. **報告和審查:**
* 總結遷移。
* **行動:** 要求使用者仔細審查變更。
* **測試位置:** 明確說明使用者應該去應用程式中的哪個位置手動測試變更(例如,「應用程式打開後點擊底部按鈕」)。
* **不要提交或推送。**
* 提供建議的 Git 提交訊息(例如,「重構:在 [類別名稱] 中使用 switch 表達式」)。

總結

代理時代的長遠目標不在於您今天產生的程式碼量;而在於負責任地設計明日儲存庫的基礎設施和文化期望。透過建立啞鈴的把手,確保我們的工具運行速度更快時,它們仍然植根於我們共同的價值觀和技術嚴謹性。

在不久的將來,代理將從反應式助理轉變為主動貢獻者——在您睡覺時檢查您的儲存庫並解決問題。透過強化您的高訊號回饋迴路並在版本控制的技能套件中記錄您的工作流程,您不僅節省了時間;您還在訓練未來的代理程式尊重您的特定架構、願景和標準。最重要的是,您正在確保隨著開發引擎的加速,您的整個團隊都擁有數位感測器和共享知識,可以帶著集體信心和更強大、更有彈性的工程文化向前邁進。


Jaime 的建構上下文:提示工程即基礎設施 最初發佈在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

【文章翻譯】The Top Ten Highlights from Flutter & Dart in 2025

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

嗨,Flutter 社群!我叫 Emma Twersky,我又回來提供 Flutterverse 的每月更新了。我非常感謝大家的熱情歡迎,也很高興能成為這個社群的一份子。

這篇文章有點一石二鳥:我們將深入探討今天直播「Flutter 飛行計畫」中的熱門新內容,幫助您在我們最常被請求的主題上騰飛。然後,我們將花點時間反思 2025 年這個真正具有里程碑意義的一年。我們全力以赴,讓 Dart 和 Flutter 成為建構出色多平台應用程式的最佳方式,我們很高興向您展示新功能和接下來的計畫。

2025 年 Flutter 和 Dart 的 10 大亮點

多麼精彩的一年!讓我們深入探討其中 10 個最重要的時刻,儘管很難縮小範圍…

您可能知道,Dart 和 Flutter 每季都會發布更新。在 2025 年,我們發布了八個內容豐富的穩定版本:

  1. Flutter 3.29Dart 3.7 (2025 年 2 月): 這個版本著重於效能和保真度,包含 Impeller 的重大更新,將 Dart 執行移至行動裝置上的主執行緒以改進原生互通性,以及新的 Dart 格式化程式。

  2. Flutter 3.32Dart 3.8 (2025 年 5 月) 我們獲得了實驗性的 Web 熱重載,Cupertino「圓角矩形」,Android 上的手寫筆支援,Dart 的交叉編譯,以及空感知元素。

  3. Flutter 3.35Dart 3.9 (2025 年 8 月): Web 熱重載成為預設,我們推出了實驗性的 Widget 預覽,引入了 Dart 和 Flutter MCP 伺服器,並宣布了 Material/Cupertino 解耦。

  4. Flutter 3.38Dart 3.10 (2025 年 11 月): Dart 加入了點位簡寫,Web 工具得到改進,Widget 預覽也整合了 IDE!此外,還有關鍵的 iOS 26/Xcode 26 支援和 UIScene 遷移路徑。

  5. 我們在年初就闡述了我們的願景,分享了我們的 Flutter 2025 路線圖更新,很高興看到這麼多成果,以及對多平台卓越和 AI 整合的持續關注。

…而且由於許多人一直在詢問,是的,我們計劃在 2026 年初再次發布類似的年度文章,因為我們將根據您的回饋繼續調整我們的路線圖。我們的目標是最終繼續使用最佳的開發者體驗和功能集來建立最佳的跨平台框架。

  1. 說到您… Flutter 社群和生態系統正在蓬勃發展!Google I/O 上,我們分享了 近 30% 的新免費 iOS 應用程式是使用 Flutter 建構的

我們對您所建構的內容感到驚訝。在 2025 年,我們與一些出色的公司合作,展示他們如何以重大方式建構和押寶 Flutter 和 Dart,包括 NotebookLM、teamLab、Agape、環球影城與渡假村、Reflection.app 和奇異家電。

今年的一些亮點包括:

talabat 是 MENA 地區領先的隨選外送平台。每天有數百萬用戶,talabat 使用 Flutter 將數百萬客戶與 8 個國家/地區的食物、雜貨等聯繫起來。

Google 的 NotebookLM 使用 Flutter 來滿足爆炸性的使用者需求,在不到 7 個月的時間內提供了令人愉悅的 4.8 星行動體驗。

teamLab 在藝術和數位解決方案中使用 Flutter,將體驗擴展到超過 3500 萬人。

Flutter 融入了 Agapé Wellness 的使命,幫助人們即使分開也能感到親近。

  1. 隨著我們持續發展,了解 Flutter 如何運作 至關重要。因此,我們製作了一整個系列關於這個主題的影片

現在我們知道它是如何運作的,讓我們讓它在未來更具彈性。

  1. Flutter 3.35 中所宣布,將 Material 和 Cupertino 解耦到它們自己的套件中的工作正在進行中。這是生態系統成熟度和彈性的一大步。我將讓 Justin 解釋這到底意味著什麼:
  1. 我們知道速度很重要…所以我們讓 build_runner 更快了(在某些情況下快了兩倍或更多!)。John 在這段精彩的影片中分享了我們如何加速 Dart 程式碼生成:
  1. 2025 年加速的另一件事是 AI 的發展速度。

AI 真正在 Flutter 和 Dart 生態系統中佔據了中心舞台。 建立代理應用程式 系列和我們在 Google I/O 上的宣布真正奠定了基調,我們將以兩項 Flutter 飛行計畫 結束這一年,為應用程式的未來做準備。2025 年帶來了 AI 輔助開發的巨大飛躍。在 Flutter 文件中的 使用 AI 建立 部分閱讀所有相關內容。

Dart 和 Flutter MCP 伺服器 現已穩定,為 Gemini CLI、Antigravity 等工具以及您使用 AI 進行開發的任何地方提供支援。
看到 Android Studio 中的 Gemini 極大地提升了 Dart 和 Flutter 開發,真是令人難以置信。而 Gemini CLI 的 Flutter 擴充功能?這對 AI 輔助應用程式建構來說是個遊戲規則改變者。

我們還宣布了 Flutter AI 工具包 v1.0,現已準備好用於您的生產工作負載。Flutter AI 工具包是一組與 AI 相關的 Widget,可以輕鬆地為您的 Flutter 應用程式添加生成式 AI 功能。自我們上次 Beta 版本發布以來,AI 工具包已遷移到 Firebase AI Logic SDK,並在此過程中添加了新功能,包括用於代理工作流程的多輪函數呼叫、插入自訂語音轉文字翻譯器的能力,以及將 LLM 回應轉化為 Widget 的完整支援。

談到新工具,Google 推出了 Antigravity,這是一種新的 IDE 體驗,旨在透過 AI 提升開發人員工作流程。我們正在與 Google 的各團隊合作,讓 Flutter 開發在 Google AI 可用的所有方面都成為世界一流的體驗。觀看 Observable 直播 以了解更多資訊。

我想分享一件我們最期待在 2026 年來臨前發生的事情…

  1. 我們在 pub.dev 上推出了 GenUI SDK for Flutter 的 Alpha 版本,為使用 LLM 建立動態 UI 開啟了大門。

GenUI 旨在幫助您從自然語言或結構化資料生成 Flutter UI,潛在地顯著加快您的開發流程。我將讓 Khanh 深入探討細節:

很高興看到社群已經在 GenUI 上進行建構了!
看看兩位社群成員是如何做的:

  • Khalid 使用 GenUI 建立了一個 AI 禮賓代理,其中包含一個很棒的總結影片。絕對值得一看!
  • Chris Sells 的 dartantic
    dartantic_ai 套件 是一個代理框架,旨在建立可以在 Dart 運行的任何地方運行的多模型代理應用程式,包括行動裝置、網頁、桌面、CLI 或伺服器。隨著新的 2.0 版本發布,dartantic 提供了 ContentGenerator,用於在新的 Flutter GenUI 專案中實作。這使您可以插入任何提供者或模型,並利用伺服器端工具(如網路搜尋和程式碼執行)和媒體生成等進階功能,包括對 Google 新的 Nano Banana Pro 的開箱即用支援。

我們正在努力使我們的 GenUI SDK 成為業界領導者。

其中一個方式是與 ADKA2UI 背後的團隊合作,提供一種更以模板為導向的 UI 生成方法。Rody 的演講探討了 Flutter 如何利用 ADK:

寒假您將建立什麼?

我列出這個清單時感到既受啟發又不知所措。創新太多了,有時候很難跟上。但幸運的是,假期是修補的完美時機!

我們都因不同的原因而期待假期,有些人去滑雪,有些人與親人共度時光,但這也是深入學習新事物的機會。

如果您是這樣的人,我們很樂意看到您建造了什麼。以下是一些我們集思廣益的想法:

  1. 在 Jaspr 中重建您的個人網站 — 並使用 Antigravity 輕鬆更改您的技術堆疊
    拿一個現有的網站,並使用代理程式將其遷移到 Jaspr,所花的時間比手動遷移所需的時間少得多,我們發現 Antigravity 在這方面非常出色。
  1. 開始學習 GenUI 的動態 UI 未來
    建立一個 GenUI Live Sketch Pad 應用程式,其中鍵入的 UI 描述由 GenUI 即時渲染。或者,如果您使用 SDK 構建了其他東西,請在社交媒體上告訴我們。該套件處於 Alpha 階段,因此我們正在積極尋求您使用它的回饋!

  2. 建構代理工作流程: 安裝 Dart MCP 伺服器 並建立一個工作流程,該工作流程會擷取您應用程式的螢幕截圖,從 Gemini 獲得評論,並使用熱重載應用更改。

  3. 無中生有地產生 UI: 進一步推進您的工作流程,使用 Stitch 設計 UI,然後請 Gemini 為您撰寫 Flutter 程式碼。

  4. 成為 Flutter 貢獻者: 首次為 Flutter 貢獻。尋找並修復開放文件問題或解決「好的首次錯誤」。

  1. 解決效能錯誤: 使用 DevTools 分析應用程式的效能。使用追蹤和程式碼代理識別並修復效能瓶頸。

  2. 現代化您的程式碼庫: 使用 Dart 3.10 的點位簡寫 重構現有的 Flutter 專案,以獲得更簡潔、更簡明的程式碼,從而提升您的專案。

  3. 探索 Flutter 中的 Gemini API 建立一個語音應用程式,展示不同的 Gemini API 功能,使用 Flutter AI Playground 範例應用程式,該應用程式使用 Firebase AI Logic SDK。

  4. 建立您自己的程式碼助理: 訓練一個代理程式,使其在您的 GitHub 儲存庫上自動管理您的套件相依性或執行其他繁瑣的任務。

  5. 使用生態系統升級您的應用程式: 整合來自 Flutter 相關業務的服務,例如用於空中更新的 Shorebird 或用於可擴展後端的 Serverpod

使用標籤 #Flutter2026 與社群分享您的寒假專案。

感謝您在 2025 年成為 Flutter 的一份子,2026 年見!

憑藉 2025 年奠定的基礎,我們對 2026 年充滿期待,我們將突破多平台開發的界限,深入探索 AI 驅動的短暫體驗,並賦予您建構真正全端、跨平台應用程式的能力。

衷心感謝令人難以置信的 Flutter 和 Dart 社群。您的熱情、回饋和貢獻使 2025 年變得精彩。我們很幸運能成為這個社群的一份子。💙

祝大家度過一個美好而富有創意的寒假。我們迫不及待想看看您在 2026 年回來建構什麼!


2025 年 Flutter 和 Dart 的十大亮點 最初發佈在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

【文章翻譯】Jaime’s build context: A Flutter developer’s thoughts about Antigravity + Tips!

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

大家好,我是 Jaime Wren,一名在 Flutter 團隊中長期從事開發者工具軟體工程師。這些年來,我見證了軟體行業的許多轉變,但整個行業剛剛以極快的速度進入了一個新的狂野西部,這既令人興奮又令人緊張。

在我看來,我們開發者是複雜的生物,受兩種力量驅動:對任務生產力的需求和對程式設計本身的內在樂趣。當我們可以進入一個快速、不間斷的循環時,我們就會茁壯成長。為了充分發揮我們作為開發者的潛力,我們需要整個工具鏈協同工作,而不會產生摩擦。當我們過渡到代理時代時,對這種緊密循環的需求是不可協商的;這正是 Flutter 具有明顯優勢的地方。

過去幾年,我測試了很多 AI 工具,等待一些真正能節省 Flutter 開發者時間的東西,而不是僅僅轉移時間花費的地方。直到 Google 的新代理 IDE Antigravity 出現,才讓我看到了轉機。它彌合了原始模型能力和實際工程實用性之間的差距。我終於看到所有圍繞 LLM 的基礎設施和工具協同工作,以消除摩擦,而不是增加摩擦。

根據我自己的測試,Flutter 不僅僅是與像 Antigravity 這樣的 AI 工具「相容」;它獨特地具備了為它們提供動力的能力。為什麼?這歸結於 Flutter 嚴格的結構和強大的工具。Antigravity 的核心理念是依賴驗證來判斷一段程式碼是否真正起作用。Flutter 的工具提供了 Antigravity 的代理所需的即時回饋,以驗證這些動作。要開始使用,只需一些設定即可配置擴充功能和 MCP 伺服器。

一些你可以做到的很棒的事情

我和 Flutter 社群的其他成員已經學會了使用 Antigravity 來加速我們的開發過程,完成一些很酷的事情。我在下面列出了一些,但我請求如果您有任何其他提示,請將它們添加到此文章的評論中。

執行測試並修復問題程式碼

您可以使用 Antigravity 來執行現有測試,修復任何導致測試失敗的問題程式碼,然後驗證測試再次通過。這是我的提示:

1
2
3
使用 `flutter test` 執行完整的測試套件。如果發生失敗,
逐一修復。應用每個修復後,最後再執行一次完整的套件,
以確保沒有回歸。

修復錯誤和警告

在推送 PR 之前,您可以使用 Antigravity 來修復您的錯誤、警告和 lint。這是我的提示:

1
2
對我的專案運行 `flutter analyze`。如果失敗,修復任何錯誤和
警告,然後驗證它們是否已修復。

發現並使用 Lint

外面有很多 Lint,但我沒有時間研究所有這些並找出哪些最適合每個專案。我發現這個很酷的提示可以幫助 Antigravity 快速掃描我的專案,建議並啟用適合它的 Lint:

1
2
3
閱讀 https://dart.dev/tools/linter-rules 並識別我隱含遵循但尚未啟用的規則。
將它們添加到 analysis_options.yaml 中,運行 flutter analyze,
並修復任何導致的違規行為。

為我的專案發現好的 pub.dev 套件

外面有大量的 pub.dev 套件,就像 Lint 一樣,研究它們需要時間和精力。我想要一種方法來找出哪些可能最適合我的專案,同時又不離開我的 IDE。這個提示對我很有用:

1
2
3
4
5
6
我需要從我的應用程式的一個實例共享偏好設定到下一個實例,
請在 https://pub.dev/ 中搜尋此功能,然後運行
`flutter pub get`,驗證 pub 狀態是否良好。
然後,在我的專案中找到一個使用此新套件的範例,
修復 `flutter analyze` 中出現的任何問題,並修復它們。
最後,為新功能添加一個測試。

多年來我對 Flutter 的心路歷程以及我興奮的原因

我記得大約 10 年前 Flutter 首次亮相。從一開始,在我看來,Flutter 就將正確的語言、框架和工具結合在一起,使其預設可用。Flutter 成功的常被忽視的一個因素是這些組件並非來自不同的供應商。相反,框架、渲染引擎、CLI 工具、IDE 工具、語言和生態系統始終由同一個組織驅動,這使這些團隊能夠協調,實現預設可用的內聚願景。正因為如此,我認為每個新的 Flutter 開發者都有一個「我終於搞懂了 Hot Reload」的時刻,這讓他們感到興奮和充滿希望,因為:

  • Flutter 基礎設施能夠在毫秒內修補程式碼。
  • 錯誤和警告會在您輸入時出現,並確保程式碼在保存之前是有效的。
  • 語言有助於防止語法錯誤和摩擦。
  • 明顯的溢出錯誤會以黃色和黑色條紋顯示,表示需要解決的佈局問題。

在過去一年中,生成式 AI 在軟體開發中的前景堪比狂野西部——演示和產品取得了長足進步,但並未遵循 Flutter 成功核心的「預設可用」原則。隨著模型改進,例如允許模型實際閱讀專案的更大上下文窗口,以及該領域的概念融合,像 Flutter 這樣的框架已經有了為代理和工作流程增加價值的切入點。Flutter 團隊今年也效仿了 GenUI 的努力、Dart 和 Flutter MCP 伺服器 以及 AI 規則 建議。

現在,隨著 Antigravity 進入競技場,我們擁有的不僅僅是一個內建在 IDE 視窗中的聊天機器人。Antigravity 存在於 IDE 中,執行命令並利用對其他 Flutter 和 Dart 專案的知識,以正確遵循您的指示並代表您在專案空間中採取行動。

作為 Flutter 工程師,我們認為理所當然的是,我們知道如何在從未見過的專案中立即運行靜態分析(dart analyze)或啟動應用程式(flutter run)。雖然這些限制都沒有限制開發人員可以使用 Flutter 創建什麼,但 LLM 和代理工具的自然結果是,我們的集體統一性使這些介面在理解和作用於我們專案的結構方面取得了巨大飛躍。

為了從 LLM 工具中獲益,代理需要透過正向回饋迴圈進行驗證。如果模型每產生十個輸出中有九個是幻覺,我可能會覺得有趣,但我不會再次使用該工具。對於 Antigravity,驗證是核心理念,旨在為代理提供回饋迴圈,讓它們在完成工作之前進行迭代。這就是現有強大 Flutter 工具的好處所在,當使用 Antigravity 協助編寫程式碼時,代理會實際迭代,直到分析乾淨、格式一致、測試通過,並且 flutter run 的輸出確認像素正在繪製。

總結

毫無疑問,這些新的 AI 工具正在重新定義我們如何識別自己為高效的開發者,並享受程式設計的樂趣。同樣毫無疑問,一個穩健、快速、不間斷的循環將繼續成為這種體驗的核心。

Antigravity 不會取代程式設計師;它會消除阻礙您的想法變成現實的繁瑣工作。循環越來越快,坡道已經建好,Flutter 的未來比以往任何時候都更容易使用——也更令人愉快。


Jaime 的建構內容:一位 Flutter 開發者對 Antigravity 的看法 + 提示! 最初發佈在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

【文章翻譯】Rich and dynamic user interfaces with Flutter and generative UI

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

Introducing the GenUI SDK for Flutter

我們很高興地介紹 Flutter 的 GenUI SDK,現已在 pub.dev 上以 Alpha 版提供。這個新的 Flutter SDK 協助您使用 Gemini (或其他 LLM) 生成動態、個人化的 UI,顯著提升 GenAI 和基於代理的使用者體驗的可用性和滿意度,同時也遵守您既定的品牌指南並使用您自己的 Widget 目錄。

當今的應用程式使用者不僅期望美觀快速的 UI,還期望更動態、深度個人化和自適應的體驗。我們正在建構 Flutter 的 GenUI SDK,這是一套套件,旨在讓您更容易地為所有使用者建構和交付新一代的體驗。

從傳統聊天機器人到動態、互動式、圖形化體驗

一個使用 Flutter 和 Gemini 建構的強大生成式 UI 體驗的絕佳範例是 Gemini 應用程式中新的實驗性 視覺佈局 功能(App StorePlay Store),該功能今天推出。它生成了一個身臨其境的雜誌風格資訊視圖,其中包含照片和模組。這些生成元素不僅看起來很棒,而且是互動式的,可幫助您進一步自訂體驗。Gemini 的新視覺佈局功能啟發了我們建構 Flutter 的 GenUI SDK,以便任何人都可以建立相同類型的動態、互動式、生成式體驗。

Flutter 的 GenUI SDK 如何運作?

GenUI SDK for Flutter 的核心是一個協調層。它協調使用者、您的 Flutter 小工具和 AI 代理之間資訊流動,將基於文字的對話轉化為豐富的互動式體驗。

Diagram of agentic loop for the GenUI SDK for Flutter
  1. 應用程式發送請求: 使用者提供一個提示(例如,「幫我規劃東京之旅!」)。您的應用程式使用提示以及有關其可以用來回應和組合成的 Widget 目錄的額外資訊呼叫您的 AI 代理。
  2. AI 代理生成內容和要顯示的 UI: AI 代理生成響應,但它不僅僅依賴文字,它還使用 GenUI SDK 提供的工具來描述最適合其生成內容的 UI。
  3. UI 動態渲染: GenUI SDK 接收響應,將其反序列化,並構建適當的 Widget。有些是資訊性的,有些是佈局,有些可以是互動式的(並且可能包括滑塊、按鈕或日期選擇器)。
  4. 使用者與動態 UI 互動: 使用者點擊按鈕和其他控制項,這可以觸發對代理的後續請求,從而導致更多的 UI 更新等等。

這個循環使您能夠超越簡單的文字回應。透過定義您自己的自訂 Widget,GenUI SDK for Flutter 可確保動態生成的 UI 符合您的品牌指南。

有關 Flutter 的 GenUI SDK 的更詳細說明和逐步說明,請查看以下影片:

幕後的 UI 協定

Flutter 的 GenUI SDK 是基於與 Google 的 A2A 團隊和 Google Labs 的 Opal 團隊合作的 即將推出的 A2UI 協定 建構的。A2UI 是一個新的(即將開源)工具包,旨在促進在任何框架中實作 LLM 生成的 UI。我們使用 A2UI 作為 LLM 生成的 UI 的序列化格式,而 Flutter 的 GenUI SDK 正在使用 A2UI 渲染器的早期版本。

我該如何開始建構 GenUI 體驗?

我們希望讓您輕鬆嘗試使用 GenUI SDK for Flutter,因此我們已捆綁了適用於 LLM 的內容生成器、用於實際操作的範例應用程式和用於編碼代理(以及人類!)的 markdown 文件

  • 首先,取得 genui 的主要 pub 套件。
  • 接下來,選擇一個內容生成器。以下是我們提供的內容生成器選項,支援各種使用案例:
    • Google Gemini API:在您規劃體驗時,對於實驗和本地測試很有用。
    • Firebase AI logic:對於與 LLM 的互動完全在您的 Flutter 用戶端中進行的生產應用程式很有用,無需伺服器。Firebase 也使得安全地交付您的 AI 功能變得更容易,因為 Firebase 處理您的 Gemini API 金鑰的管理。
    • A2UI:對於代理在伺服器上運行的客戶端/伺服器架構很有用。
    • 自建:當然,您也可以建構自己的轉接器以連接到您偏好的 LLM 提供者。預計我們和社群很快會提供更多內容。

為了讓您的編碼代理能夠輕鬆地使用 Flutter 的 GenUI SDK 進行建構,我們還包含了 markdown 文件。這些 markdown 文件教您的編碼代理如何使用各種 GenUI SDK API。

flutter/genui 儲存庫 包含您可以使用的範例應用程式,可為您提供建構 GenUI 體驗的良好起點。以下影片展示了 Landscape design app,它為您提供了 Flutter 客戶端與使用 A2A(Agent-to-Agent)和 ADK 的基於 Python 的伺服器互動的範例,其中 AI 代理動態生成 UI。在此演示應用程式中,使用者可以上傳其庭院的圖片,Gemini 會對其進行分析,然後透過 Flutter 的 GenUI SDK 提供自訂 UI,供使用者輸入其更新庭院景觀的限制和要求。一旦使用者輸入其偏好設定,他們就會看到一個考慮到其選擇的結果。此應用程式演示了基於 GenUI 的體驗如何改善人與代理之間的協作。

Landscape design app demo

接下來會發生什麼?

我們正在建構 Flutter 的 GenUI SDK,以幫助您透過單一程式碼庫在行動、網頁和桌面平台上提供個人化、動態、AI 驅動的應用程式體驗。以下是我們正在考慮納入路線圖的一些事項:

  • 代理開發套件 (ADK) 外掛: ADK 的交鑰匙整合。
  • 擴展的 LLM 框架支援: 針對其他流行 AI 模型和後端框架的官方適配器。
  • 降低感知延遲: 隨著 LLM 生成標準 UI 組件,逐步渲染它們,而不是等待完整的響應。
  • 全螢幕組合: 超越串流中的單個小工具,讓 LLM 根據使用者意圖組合整個螢幕佈局並處理複雜的應用程式導航。
  • Dart 位元組碼: 提供真正的伺服器驅動 UI,允許後端透過網路發送全新的小工具邏輯,而不僅僅是您二進制檔案中已有的小工具的配置。
  • Genkit 整合:Genkit(一個開源 AI 框架)整合。

該專案仍處於早期階段,因此我們很高興聽到您的想法和 回饋。我們迫不及待想看看您使用 Flutter 建構的 GenUI 體驗!


使用 Flutter 和生成式 UI 打造豐富動態的使用者介面 最初發佈在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

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