【文章翻譯】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/

【文章翻譯】Gemini for DartPad

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

DartPad 獲得 Gemini 加持

嗨,開發人員!

DartPad 是我們許多人嘗試新想法、學習 Dart 和 Flutter 細微差別以及直接在瀏覽器中進行實驗的地方。我們很高興能讓這個過程更快、更有效率。歡迎來到 DartPad 中的 Gemini!您現在可以:

  • 從提示生成新程式碼。
  • 使用圖片,例如 UX 模擬圖和螢幕截圖來協助程式碼生成。
  • 從提示重構現有程式碼。
  • 針對分析和執行時錯誤建議程式碼修正。

讓我們詳細介紹這些酷炫的新功能。

從提示生成新程式碼

DartPad 使用者現在可以利用 Gemini 直接從自然語言提示中生成新的 Dart 或 Flutter 程式碼片段。

從 AI 提示建立 Dart 和 Flutter 程式碼

使用圖片協助程式碼生成

您也可以將圖片加入到提示中。圖片可以協助程式碼生成。

使用圖片協助程式碼生成

從提示重構現有程式碼

除了完全生成新的程式碼片段外,DartPad 中的 Gemini 還可以幫助您反覆運算和修改現有程式碼。

從提示重構現有程式碼

針對分析錯誤建議程式碼修正

在 DartPad 現有的顯示 Dart Analyzer 診斷訊息的功能基礎上,我們整合了 Gemini 來幫助解決程式碼中可能出現的問題。如果您的程式碼片段在分析面板中標記了錯誤,您只需在分析面板中選取 Gemini 圖標,檢閱建議的變更,如果您同意,則接受。

針對分析錯誤建議程式碼修正

針對執行時錯誤建議程式碼修正

DartPad 還可以為執行時錯誤提供錯誤修正建議。

針對執行時錯誤建議程式碼修正

總結

DartPad 致力於尋找降低嘗試新想法和學習 Dart 和 Flutter 的門檻的方法。我們與 Gemini 的新整合是沿著這條道路邁出的另一步,讓您可以更輕鬆地進行實驗和探索。我們迫不及待想看看您會建立什麼!


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

【文章翻譯】Flutter 2025 roadmap update

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

透明度是 Flutter 開源計畫的核心目標,從議題到設計規格都在公開環境中分享。最常被要求提供的資訊之一是 Google 核心 Flutter 團隊的年度藍圖,今天我們很高興分享 2025 年藍圖

我們自 2020 年以來一直在發佈我們的藍圖,這是往年工作的自然延續;我們仍在努力實現我們的長期目標,即創建最受歡迎、增長最快且生產力最高的跨平台 UI 框架,以建立豐富的應用程式體驗!

有關所有詳細資訊,請查看剛剛更新的 GitHub 上的 Flutter 藍圖

與任何其他軟體產品藍圖一樣,請注意計畫會在全年調整和適應,因此如果在此過程中發生一些變化,請不要感到驚訝。但我們仍然認為分享我們的整體計畫很重要。

另請注意,我們在此列出的內容主要是從我們這些在 Google 擔任 Flutter 員工的人收集的內容。現在非 Google 貢獻者的人數已超過 Google 員工,因此這不是我們希望今年 Flutter 中所有新的和令人興奮的事情的詳盡列表!

我們仍然非常感謝社群和您持續的支持。我們迫不及待地想看看您會建立什麼!


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

【文章翻譯】Dart in Google Summer of Code 2025

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

我們很高興地宣布 Dart 專案將在 Google Summer of Code 2025 中指導貢獻者(第六次!)。

Google Summer of Code (GSoC) 計畫著重於將世界各地的學生開發者帶入開源軟體開發領域。Google 資助學生在夏天與一個指導開源組織合作進行一個為期 12 週(或更長)的程式專案。在過去的 20 年中,超過 21,000 位貢獻者參與了 Google Summer of Code。

您有興趣嗎?

立即開始,閱讀 專案想法列表 找到符合您技能和興趣的專案。正式申請必須在 4 月 8 日之前提交。我們鼓勵潛在申請者盡早提交草稿並要求回饋。

Dart 團隊預計會有足夠的指導者僅接受少數申請,因此也請查看其他指導組織

如果您有關於 Dart 和 GSoC 的特定問題,請在我們專門的 郵寄清單 上提出。

若要深入了解 Google Summer of Code,請觀看以下影片或閱讀 Google Summer of Code 貢獻者指南

我們期待您的來信!


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

【文章翻譯】Announcing Dart 3.7

【文章內容使用 Gemini 1.5 Pro 自動翻譯產生】

宣佈 Dart 3.7

新年新氣象,也是時候推出新的 Dart 穩定版本了。歡迎來到 Dart 3.7!

此版本的主题是開發者生產力。我們透過調整 Dart 處理萬用字元變數的方式,使其更加一致。Dart 格式化工具中還有一種全新的樣式、分析器中新增了快速修復和程式碼檢查,以及 pub.dev 上的幾個很酷的新功能。讓我們來看看詳細資訊吧!

Announcing Dart 3.7
宣佈 Dart 3.7

巨集更新

我們最近在議題追蹤器以及一篇部落格文章中發佈了更新,聲明我們將停止開發實驗性的巨集功能。對於這個令人遺憾的結果,我們感謝社群的理解。

然而,隨著這一變化,團隊重新獲得了一些能力來投入其他有價值的開發。我們已經在研究build_runner 效能的改進,我們仍然希望推出擴充語言功能(可能以略微不同的形式),並且我們希望找到新的更直接的方法來支援建模資料和處理序列化和反序列化(例如,與 JSON 之間的轉換)。

萬用字元變數語言功能

名稱為 _ 的局部變數和參數現在是函數式語言中所說的「萬用字元」。這意味著名稱是一個佔位符,並且不宣告實際變數。

目前在 Dart 中,如果回調的程式碼主體實際上不需要使用參數,則通常使用 _ 作為回調參數的名稱,如下所示:

1
2
3
4
5
void announceCompletion(Future<void> future) {
future.then((_) { // <--
print('Complete!');
});
}

但是,如果回調有多個您不需要使用的參數,您最終會將它們命名為 ______ 等,因為否則名稱會衝突。現在,在 Dart 3.7 中,名為 _ 的參數和局部變數實際上並不建立變數,因此不存在名稱衝突的可能性。您可以對多個參數使用 _,如下所示:

1
2
3
4
5
void announceFailure(Future<void> future) {
future.onError((_, _) { // <--
print('Error!');
});
}

如果您有宣告名為 _ 並使用它的參數或變數的程式碼,則該程式碼將不再適用於 Dart 3.7。例如:

1
2
3
4
var [1, 2, 3].map((_) {
return _.toString();
// ^ 錯誤!參考未知變數。
});

在這種情況下,您必須重新命名參數或局部變數。此語言變更僅適用於參數和局部變數(不適用於頂層變數或成員),因此您可以執行此重新命名而不會破壞程式庫的公共 API。

萬用字元變數是一個小功能,使語言更加一致。在模式中,名為 _ 的變數一直都是這種行為:

1
2
var [_, _, third, _, _] = [1, 2, 3, 4, 5];
print(third); // 輸出 "3"。

現在參數和局部變數的行為方式相同。

Dart 格式化工具中的新格式化樣式

Dart 3.7 包含一個重新編寫的 Dart 格式化工具 (dart format),具有新的格式化樣式。新樣式看起來與您在參數列表中加入尾隨逗號時獲得的樣式相似,只是現在格式化工具會為您加入和移除這些逗號。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 舊樣式:
void writeArgumentList(
Token leftBracket, List<AstNode> elements, Token rightBracket) {
writeList(
leftBracket: leftBracket,
elements,
rightBracket: rightBracket,
allowBlockArgument: true);
}

// 新樣式:
void writeArgumentList(
Token leftBracket,
List<AstNode> elements,
Token rightBracket,
) {
writeList(
leftBracket: leftBracket,
elements,
rightBracket: rightBracket,
allowBlockArgument: true,
);
}

這是對工具、其產生的輸出及其行為方式的重大變更。為了使轉換盡可能順暢,您獲得的格式化樣式取決於您正在格式化的程式碼的語言版本。如果語言版本是 3.6 或更早版本,則程式碼將使用舊樣式格式化。如果是 3.7 或更高版本,則會使用新樣式。

當您透過修改套件的 pubspec 中的 SDK 約束(並運行 dart pub get!)將套件升級到使用 Dart 3.7 時,您將選擇使用新的格式化樣式。

為了確定它格式化的每個檔案的語言版本,dart format 會尋找 package_config.json。這意味著**您需要在格式化套件中的程式碼之前運行 dart pub get**。如果您的持續整合伺服器中有格式檢查,請確保它也運行 dart pub get

我們不打算無限期地支援這兩種樣式。在未來的某個時間點,當大多數生態系統都在 3.7 或更高版本上時,對舊樣式的支援將被移除。

新樣式包含一些長期以來要求的功能:

  • 專案範圍頁面寬度設定。 您現在可以在 analysis_options.yaml 檔案中以專案範圍的方式設定您喜歡的格式化頁面寬度,如下所示:
1
2
formatter:
page_width: 123
  • 選擇不格式化程式碼區域。 您可以使用一對特殊的標記註釋來選擇不格式化程式碼區域:
1
2
3
4
5
main() {
// dart format off
no + formatting + here;
// dart format on
}

還有一個重大變更。格式化工具不再支援 dart format --fix。請改用 dart fix 來套用 dart format 可以套用的所有修復,以及更多修復。

您可以在變更日誌常見問題中找到更多詳細資訊。

Dart 分析器中更新的快速修復和新的程式碼檢查

我們一直在積極改進 Dart 以提高開發者的生產力,這意味著在 Dart 3.7 中透過新的程式碼檢查、快速修復和輔助來改進分析器。一個值得注意的補充是 unnecessary_underscores 程式碼檢查,它支援新的萬用字元變數功能。

Dart 3.7 包含了廣泛的新快速修復和輔助,包括修復常見問題,例如缺少 await 關鍵字、不正確的匯入前綴以及違反程式碼檢查規則,例如 cascade_invocations。還有一些方便的重構程式碼的輔助,例如將 else 區塊轉換為 else if,以及使用 ExpandedFlexible 包裝 Flutter Widget。

您可以在分析器變更的完整列表中找到所有這些以及更多詳細資訊。

在 Dart Web 平台上前進

一年前,我們推出了新的程式庫和套件,用於從 Dart 與 JavaScript 和瀏覽器 API 互操作。展望未來,主要的 JavaScript 程式庫是 dart:js_interop。對於瀏覽器 API,請使用 package:web

作為我們持續努力將 Dart 和 Flutter 生態系統遷移到與 WebAssembly 相容的 API 的一部分,我們正在棄用 Dart SDK 中相關的舊 API。在 Dart 3.7 版本中,七個 Dart SDK 程式庫已被棄用:

  • dart:html
  • dart:indexed_db
  • dart:js
  • dart:js_util
  • dart:web_audio
  • dart:web_gl

我們計劃在 2025 年底移除這些程式庫。您可以在JavaScript 互操作性頁面上了解它們的替代品。

pub.dev 套件網站上的新生產力功能

12 月,我們在 pub.dev 上推出了套件下載計數。這些顯示每月下載量以及一個顯示每周下載量隨時間變化的

小型圖表。

今天,我們正在擴展它,支援檢視每個套件版本的下載計數。現在可以指示有多少套件使用者已升級到最新版本(或僅最新主要版本)。這些見解旨在幫助套件作者評估將修復程式碼移植到套件舊主要版本的價值。

每週下載圖表
每週下載圖表

pub.dev 的深色模式

pub.dev 的深色模式長期以來一直是一個熱門請求,從今天起,現在可以將 pub.dev 切換到深色模式。此切換會影響套件頁面和 pub.dev 上託管的套件 API 文件。

pub.dev 的深色模式

pub.dev 的主題

去年,我們在 pub.dev 上推出了對主題的支援。您可以在 pubspec.yaml加入主題,如果您看到應該合併的相關主題,您可以透過拉取請求提出規範化

瀏覽 pub.dev 的使用者可以點擊主題來瀏覽相關套件。我們之前介紹了在 pub.dev 上搜尋主題的功能,使用搜尋關鍵字(例如「topic:widget」),但找到這些關鍵字並非易事。因此,我們在 pub.dev 上推出了一個類似 IDE 的搜尋關鍵字自動完成工具。您可以透過按下 ctrl+space 來觸發它,或者在您輸入匹配的前綴(例如「topic:」或「license:」)時自動觸發它。

主題搜尋關鍵字

總結

這就是我們今天為 Dart 3.7 準備的全部內容。與往常一樣,請告訴我們您的想法!另外,別忘了查看今天的Flutter 3.29 版本的部落格文章。下次再見!


宣佈 Dart 3.7 最初發佈在 Medium 的 Dart 上,人們在那裡透過醒目顯示和回應這個故事來繼續對話。