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

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

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

Flutter 3.29 的新功能

提升跨平台的效能和保真度

簡介

深入了解 Flutter 3.29!此版本改進了開發並提升了效能,其中包括對 Impeller、Cupertino、DevTools 等的更新。Flutter 3.29 在此版本週期中有 104 位獨特的作者貢獻,展現了社群的奉獻精神。讓我們一起探索新功能!

架構

Cupertino 更新

CupertinoNavigationBarCupertinoSliverNavigationBar 現在接受一個 bottom widget,通常是一個搜尋欄位或分段控制項。

CupertinoSliverNavigationBar 中,可以使用 bottomMode 屬性 來設定這個底部 widget,使其自動調整大小直到隱藏,或在捲軸導航欄時始終顯示。

.automatic
.always

導航欄的其他變更包括:

  • 新的 CupertinoSheetRoute 顯示一個 iOS 風格的模態表單視圖,可以使用拖動關閉手勢移除。
  • 新的 showCupertinoSheet 函式顯示帶有內建巢狀導航的常用設定的表單。
改進前 - 左側是原生視圖,右側是 Flutter 視圖
改進後 - 左側是原生視圖,右側是 Flutter 視圖
  • 反轉時,Flutter 的文字選取控制碼會在 iOS 上交換順序,文字選取放大鏡的邊框顏色現在與目前主題相符。

Material

  • FadeForwardsPageTransitionsBuilder 是新的 Material 3 (M3) 頁面轉場建構器,旨在與 Android 的最新頁面轉場行為相符。在轉場期間,進入的頁面從右向左滑入的同時淡入,而離開的頁面從右向左滑出的同時淡出。這個新的轉場還解決了之前由 ZoomPageTransitionsBuilder 引起的效能問題。
  • 此版本更新了 CircularProgressIndicatorLinearProgressIndicator,以符合最新的 Material Design 3 規範。要使用更新的樣式,請將 year2023 屬性設定為 false,或將 ProgressIndicatorThemeData.year2023 設定為 false
  • 此版本還引入了最新的 Material 3 Slider 設計,其中包含更新的軌跡和控制碼形狀。Slider 預設為先前的 Material 3 樣式。要啟用最新設計,請將 year2023 設定為 false,或將 SliderThemeData.year2023 設定為 false

此版本包含 Material 函式庫的多個錯誤修復和功能增強。值得注意的修復包括:

  • 鍵盤導航現在可以正確觸發 DropdownMenu.onSelected 回調。
  • 改進的 TabBar 彈性標籤動畫。
  • 改進的 RangeSlider 與分割的拇指對齊、拇指填充和圓角。

除了錯誤修復之外,此版本還增強了多個 Material 元件的自訂性。mouseCursor 屬性已加入到 ChipTooltipReorderableListView 中,允許在懸停時使用自訂滑鼠游標。

文字選取

Flutter 現在透過 SelectionListenerSelectionListenerNotifier 提供有關 SelectionAreaSelectableRegion 下選取範圍的更多資訊。透過 SelectionListenerNotifier 提供的 SelectionDetails 物件,您可以獲得選取範圍的開始和結束偏移量(相對於包裝的子樹),並指示是否存在選取範圍以及是否已摺疊。對於您想要監聽的 widget 或可選取的子樹,請使用 SelectionListener widget 包裝它。

Flutter 還透過 SelectableRegionSelectionStatusScope 繼承 widget 提供有關 SelectionAreaSelectableRegion 狀態的資訊。您可以使用 SelectableRegionSelectionStatusScope.maybeOf(context) 並檢查 SelectableRegionSelectionStatus 來檢查父 SelectionAreaSelectableRegion 是否正在主動變更或已完成選取。

輔助功能

此版本改進了多個 Material widget 的輔助功能:

  • 啟用螢幕閱讀器時,Form widget 只會播報它遇到的第一個錯誤。
  • 螢幕閱讀器現在會播報下拉式選單的正確標籤。

網頁

Flutter 的 WebAssembly (wasm) 支援在 2024 年 5 月首次發佈時,需要您使用特殊的 HTTP 回應標頭來託管 Flutter 應用程式。現在,此要求已放寬。雖然更新標頭允許使用 wasm 建構的 Flutter 網頁應用程式以多執行緒運行,但使用預設標頭現在允許應用程式以 wasm 運行,但僅限於單執行緒。

我們已經修復了 WebGL 後端中與圖片相關的多個問題,但最重要的是:

引擎

Impeller Vulkan 穩定性

感謝 3.27 beta 和穩定版本的回饋和錯誤報告,我們對 Vulkan 後端進行了許多正確性和效能方面的改進,包括:

  • 修復了許多使用者在舊版 Vulkan 相容設備上報告的可重現閃爍和視覺抖動。
  • 禁用了 Android 硬體緩衝區交換鏈。此功能已放置在功能標記後面,直到確定它在所有 Android 設備上都能正常工作。
  • 大量的黑屏和崩潰報告是由於在聯發科/PowerVR soc 上使用 Vulkan 造成的,現在已停用。這些設備現在只使用 Impeller OpenGLES(見下文)。
  • Android 模擬器已更新為使用 Impeller GLES 後端。

Impeller OpenGLES

在 3.29 中,沒有功能性 Vulkan 驅動程式的 Android 設備將會回退到在 OpenGLES 上運行的 Impeller,而不是使用 Skia。此行為預設啟用,無需設定。這使得 Impeller 對 Android 的支援涵蓋了 Flutter 支援的所有 Android 設備的 100%。

iOS 上的 Impeller

Skia 支援已從 iOS 後端移除,FLTEnableImpeller 選擇不使用標記不再有效。隨著我們開始從 iOS 建構中移除 Skia 元件,預計未來版本中二進位制大小會進一步縮小。

新功能

此版本包含許多利用 Impeller 後端的新功能。

背景濾鏡優化

顯示多個背景濾鏡的應用程式現在可以使用新的 widget BackdropGroup 和新的 BackdropFilter.grouped 建構函式。這些可以比 Skia 後端進一步提高多個模糊的效能。範例請參考 basic.dart 原始碼。

ImageFilter.shader

新的 ImageFilter 建構函式允許將自訂著色器應用於任何子 widget。這提供了與 package:flutter_shaders 中的 AnimatedSampler widget 類似的功能,不同之處在於它也適用於背景濾鏡。範例請參考 painting.dart 原始碼。

Android/iOS 上的 Dart 執行緒變更

以前,Flutter 在與平台主執行緒不同的執行緒(UI 執行緒)上執行 Dart 程式碼。如果平台和 UI 執行緒都被佔用,這允許更高的理論吞吐量,但代價是大多數平台互操作都需要序列化和非同步訊息傳遞。這種架構還會對文字輸入、輔助功能、Plugin 等產生連鎖反應。

從 3.29 開始,Android 和 iOS 上的 Flutter 在應用程式的主執行緒上執行 Dart 程式碼,不再有單獨的 UI 執行緒。這是一系列改進行動平台上平台互操作性變更的第一部分,因為它允許在沒有序列化和訊息傳遞開銷的情況下與平台進行同步調用。

DevTools 和 IDE

新的 DevTools 檢查器

新的 DevTools 檢查器預設為所有使用者啟用。新的檢查器具有簡潔的 widget 樹、新的 widget 屬性視圖,以及一個選項,可以自動更新以響應熱重載和導航事件。更多詳情,請造訪 docs.flutter.dev 上的 新的檢查器頁面

設備上 widget 選取的變更

從 DevTools 檢查器啟用 widget 選取模式後,設備上的任何選取都將被視為 widget 選取,直到您退出 widget 選取模式為止。以前,在初始 widget 選取之後,您需要點擊設備上的選取 widget 按鈕才能選取另一個 widget。現在,設備上有一個按鈕,可以用於快速退出 widget 選取模式。

記錄工具改進

DevTools 中的記錄工具已透過以下方式進行改進:

  • 記錄包含並顯示更多中繼資料,例如記錄嚴重性、類別、區域和隔離區。
  • 加入依記錄嚴重性級別進行篩選的支援。
  • 效能和初始載入時間的顯著改進。

這些只是此版本中的一些亮點。要進一步了解 Flutter 3.29 中包含的所有更新,請查看 DevTools 2.41.02.42.2 的發行說明。

重大變更和棄用

停止套件支援

我們計劃在 2025 年 4 月 30 日停止對以下套件的支援:

  • ios_platform_images;請參閱 #162961
  • css_colors;請參閱 #162962
  • palette_generator;請參閱 #162963
  • flutter_image;請參閱 #162964
  • flutter_adaptive_scaffold;請參閱 #162965
  • flutter_markdown;請參閱 #162966

我們鼓勵社群中任何感興趣的成員協調建立和維護分支。上面提供了用於討論和協調的議題連結。

移除基於腳本的 Flutter Gradle Plugin 應用

移除基於腳本的 Flutter Gradle Plugin 應用,自 3.19 起已棄用。這支援將 Flutter Gradle Plugin 從 Groovy 轉換為 Kotlin,並將其遷移到使用 AGP 的公共 API。預計這項工作可以減少發佈新的 AGP 版本時損壞的頻率,並減少基於建構的回歸。

在 3.16 之前建立且尚未遷移的專案可能會受到影響。如果 flutter 工具在建構您的專案時記錄警告:「您正在強制性地應用 Flutter 的主要 Gradle Plugin」,則您會受到影響,並且需要根據 docs.flutter.dev 上的 Flutter Gradle Plugin 的強制性應用已棄用 進行遷移。

移除網頁 HTML 渲染器

這是第一個從 Flutter 網頁中移除 HTML 渲染器的版本。更多資訊,請造訪 計劃棄用並移除 Flutter 網頁中的 HTML 渲染器議題 145584:計劃棄用並移除 Flutter 網頁中的 HTML 渲染器

網頁圖片處理

此版本還讓您可以 更好地控制圖片在網頁上的顯示方式。在先前的 beta 版本 (3.28) 中,當發生 CORS 錯誤時,Image widget 會自動使用 <img> 元素來顯示來自 URL 的圖片。這可能會導致不一致的行為。現在,webHtmlElementStrategy 標記可讓您選擇何時使用 <img> 元素。雖然此回退預設停用,但如果您的應用程式需要,您仍然可以啟用回退,甚至可以優先使用 <img> 元素。

Material 標準化

作為我們正在進行的 Material 主題標準化專案的一部分,此版本棄用了 ThemeData.dialogBackgroundColor,轉而使用 DialogThemeData.backgroundColor。您可以使用 dart fix 命令來遷移受影響的程式碼。

同樣在 Material 中,在將 ButtonStyleButton.iconAlignment 屬性加入到 ButtonStyle 和相關的 styleFrom 方法之後,該屬性已棄用。

此版本中的所有 重大變更,請參閱網站重大變更頁面上的完整遷移指南列表。

與往常一樣,非常感謝社群為 貢獻測試 - 這些測試幫助我們識別重大變更。要進一步了解,請查看 Flutter 的重大變更政策

結語

感謝 Flutter 社群讓此版本成為可能!我們對未來感到興奮,並迫不及待地想看到您的應用程式。查看 發行說明和變更日誌,然後運行 flutter upgrade 並開始建構吧!


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

【文章翻譯】An update on Dart macros & data serialization

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

關於 Dart 巨集和資料序列化更新

在過去幾年中,我們投入了大量的時間和資源來構建巨集的原型。遺憾的是,每次我們解決一個主要的技術障礙時,都會出現新的障礙。目前,我們認為巨集在短期內無法達到我們可以安心發佈的功能水準,並且達到我們期望的品質和開發時間效能。

在考慮了機會成本之後,特別是我們可以向社群提供的其他功能,我們做出了艱難的決定,停止巨集的開發工作。

背景

我們相信 Dart 提供了獨特的優勢組合:(1) 預先編譯和靜態語言的典型效能,以及 (2) 動態語言的快速開發週期(例如,狀態熱重載)。隨著 Dart 的發展,我們一直謹慎地評估語言的變更是否符合這兩個標準。

在這種情況下,基於豐富內省功能的強大元程式設計一直是一個挑戰。運行時內省(例如,反射)使得執行樹搖優化變得困難,而樹搖優化可以讓我們產生更小的二進位檔案。靜態內省(例如,巨集)可以採用幾種形式。大多數語言採用語法方法,對程式的語法進行有限的靜態反射。我們認為這不足以實現我們的目標。相反,我們的目標是構建一個巨集系統,支援在編譯時對程式進行深度語義內省。遺憾的是,語義內省會帶來大量的編譯時間成本,這使得狀態熱重載難以保持狀態。

我們的結論是,我們離以我們要求的開發時間效能發佈巨集還差得很遠。我們目前的實作會降低編輯(例如,靜態分析和程式碼完成)和增量編譯(熱重載的第一步)的效能。我們不確定我們是否能在合理的時間範圍內充分解決這些問題。

展望未來

我們已決定專注於我們更有信心發佈的其他功能。

我們將投入的一個領域是在 Dart 中更好地支援資料。這是 Dart 和 Flutter 問題追蹤器中請求最多的問題。事實上,我們開發巨集的主要動機是提供更好的資料處理、序列化和反序列化。我們仍然會追求更好的資料處理方式,但我們打算使用更專門的語言功能來做到這一點。

我們將投入的另一個領域是改進構建時間和整體程式碼生成體驗。我們已經確定了 build_runner 的改進。我們還計劃發佈擴充,這是我們作為巨集的一部分構建的原型功能。我們相信這個語言功能可以獨立存在,並且會改進現有的程式碼生成。我們仍然打算單獨發佈這個功能

我們理解這個消息會讓你們中的許多人感到失望。從長遠來看,我們仍然有興趣探索通用的元程式設計,因為它除了資料之外還有許多潛在的用例。儘管如此,我們也要向我們的社群明確表示,在可預見的未來,我們不會發佈巨集。

我們要感謝所有嘗試巨集、提供回饋以及透過 PR 直接貢獻的人。這些投入和精力將有助於我們接下來的工作。我們對今年可以提供的改進感到興奮。


Dart 巨集和資料序列化更新 最初發佈在 Medium 的 Dart 上,人們在那裡透過突出顯示和回應這個故事來繼續討論。

【文章翻譯】Celebrating Flutter’s “Production Era”

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

慶祝 Flutter 的「生產時代」

就在六年前,我們推出了 Flutter 1.0。今天,在 #FlutterInProduction 上,我們正在慶祝我們取得的成就——從社群中 數千名貢獻者 的巨大支持,到 Flutter 作為用於建構跨平台應用程式體驗的生產級應用程式框架的 廣泛採用

如果您還沒有體驗過 Flutter,我們邀請您試用一下!正如我們今天分享的那樣,您將加入一個龐大的群體:Flutter 在全球擁有 超過 100 萬月活躍開發人員,並且 為近 30% 的所有新 iOS 應用程式提供支援。超過 9 萬名開發人員積極參與了 60 多個國家的 Flutter 聚會。如果您希望在設計或建構新的成功的 Flutter 應用程式方面獲得意見,我們有一個龐大且不斷增長的 Flutter 顧問 列表,隨時準備為您提供幫助。

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

Apptopia Inc.

十年的創新,邁向生產時代

這是一段不可思議的旅程,始於 2014 年(也就是我們現在所說的實驗時代),當時它是 Google 的一個代號為「Sky」的實驗。

在 Flutter 出現之前,妥協是不可避免的。許多開發人員已經開始懷疑,任何框架是否都能夠真正跨多個平台提供優質的體驗。

隨著 2018 年 Flutter 1.0 的推出,我們有了一個明確的使命來解決這個技術困境:我們的目標是為開發人員提供終極應用程式框架,以便在所有平台上製作美觀、高效能的使用者介面。此外,還要讓開發人員能夠在客戶關心的所有平台上以高品質的應用程式接觸所有客戶,但 成本更低時間更短

即使我們增加了對行動、網頁和桌面六大主要平台的支援,並且透過豐田將 Flutter 用於資訊娛樂系統等工作 繼續拓展,我們的重點在 Flutter 的增長期一直保持不變。

我們現在正處於「生產時代」,我們正在用 #FlutterInProduction 慶祝這一點!此活動重點介紹了在實際應用程式中使用 Flutter 的開發人員所取得的成就。

與社群合作建構

沒有我們超過 1,400 名貢獻者、超過 10,000 名套件發佈者(編寫了超過 50,000 個套件)以及充滿熱情的 Flutter 內容創作者和愛好者的驚人社群,這一切都不可能實現。

我們共同建構了一個 GitHub 貢獻排名前五的開源專案

令人驚嘆的使用者體驗

這一切都始於對實現令人驚嘆的使用者體驗的關注。擺脫了典型的平台限制,Flutter 支援廣泛的設計語言——SDK 附帶了對 Material Design 和我們受 Apple 啟發的 Cupertino Widget 的支援。生態系統還提供了廣泛的設計函式庫選擇,例如 Windows 啟發的 fluent_ui、macOS 啟發的 macos_ui 和 Ubuntu 啟發的 yaru Widget。

斯堪地那維亞航空公司設計獎

使用 Flutter,您擁有實現設計團隊預想的 任何設計 的靈活性和能力。斯堪地那維亞航空公司就是一個很好的例子,他們在使用 Flutter 建立了新的行動應用程式後,獲得了許多著名的設計獎項,例如紅點設計獎、威比人民之聲獎和 iF 設計金獎。SAS 的執行副總裁兼首席資訊長 Charlotte Svensson 解釋說

“我對這個獎項感到非常自豪,它不僅僅是一個行業獎項,而是一種全球認可。這證明了當我們超越自我,專注於改善客戶體驗,以及當我們與客戶互動和共同發展時,我們能夠做到什麼。SAS 一直處於航空業創新的前沿,這個獎項也驗證了我們致力於為客戶提供卓越的數位解決方案的承諾。”

Scandinavian Airlines design awards

出色的效能和可靠性

效能和可靠性對於積極的使用者體驗和品牌認知至關重要。速度緩慢或容易崩潰的應用程式不僅會在短期內讓使用者感到沮喪,而且還會透過負面評論和口碑在長期內損害您的品牌聲譽。

Flutter 從一開始就優先考慮效能和可靠性。透過選擇 Dart 程式語言,我們確保透過提前編譯為原生機器碼或 WebAssembly 來實現快速啟動時間。Dart 豐富的空安全類型系統有助於在開發過程中捕獲錯誤,從而進一步提高可靠性。此外,Flutter 的自訂 Impeller 渲染引擎專為跨平台 UI 設計,可提供流暢的動畫,並讓我們完全控制從 UI 原始碼到 GPU 的整個渲染堆疊。

環球影城的效能和可靠性

例如,環球目的地與體驗最近報告說,透過採用 Flutter,他們不僅減小了應用程式的大小(這對於網路連線不可靠的使用者來說是一個很大的好處),而且還大幅減少了應用程式崩潰,幾乎為零,從而降低了他們的總擁有成本。

LG 電子的效能

由於擔心傳統原生應用程式的高開發成本,LG 電子傳統上一直依賴 Web 應用程式來開發其 webOS 驅動的智慧電視。但是,他們發現 Web 應用程式的啟動速度比原生應用程式慢,而且佔用更多記憶體。透過 Flutter,LG 電子擁有一個結合了快速開發速度和出色效能的解決方案。因此,他們計劃從 2025 年開始在全球範圍內將 Flutter 用於 webOS 電視中的關鍵應用程式。

一流的開發人員體驗和蓬勃發展的生態系統

Flutter 的成功深深植根於其對開發人員體驗的關注。我們使用 Stateful Hot Reload 開創了即時開發人員工作流程,並在我們的增長期增加了 Flutter DevTools,以顯著加快診斷和除錯工作流程。

Flutter 的社群提供了一個由超過 10,000 名發佈者發佈的超過 50,000 個套件組成的蓬勃發展的開放生態系統,以及強大的第三方服務和技術。此外,如果您希望在設計或建構新的成功的 Flutter 應用程式方面獲得意見,我們有一個龐大的 Flutter 顧問 列表,隨時準備為您提供幫助。

MGM 和開發人員生產力

應用程式代理商 Superformula 自 2020 年 8 月以來一直在使用 Flutter 進行建構。他們發現 Flutter 易於學習且文件齊全,使他們能夠讓新團隊成員快速上手並有效地做出貢獻。

Superformula 還使用 Flutter 為 MGM Resorts 的 400 多家餐廳 重振數位用餐體驗。新的基於 Flutter 的 MGM Rewards 應用程式僅在 4 個月內就重建完成,程式碼總量減少了一半,交付速度提高了 4 倍。Superformula 生產力的一個核心推動因素是能夠在行動設備、基於平板電腦的資訊站和基於 Web 的工具之間共用程式碼。

GEICO 和行動開發的民主化

今年早些時候,美國汽車保險公司 GEICO 發表了一篇部落格文章,詳細介紹了他們使用 Flutter 的經驗以及 Flutter 如何提高他們的生產力。他們能夠改變其組織結構,以便 UX 團隊現在 跨所有管道 擁有整個體驗,減少了相同功能的不同實作之間的差異。他們還將 Flutter 的開發體驗描述為 “成熟的,具有豐富的工具和對軟體開發生命週期 (SDLC) 的支援”

GEICO user interface elements shared across web, iOS, and Android.

未來搶先看

正如我們所說,Flutter 團隊在未來幾年將承擔的一些最重要的工作是維持向全球數億使用者提供基於 Flutter 的體驗的企業所要求的支援的品質和深度。

為了滿足這些不斷發展的需求,我們正專注於幾個關鍵領域:

  • 更深層次的 iOS 保真度: 我們將繼續透過擴展 Cupertino Widget 來提供對 Apple 設計語言的更高保真度。我們正在擁抱現代 Apple 生態系統標準,例如 Swift Package Manager。
  • 無縫平台整合: 我們正在研究一種新的互操作方法——直接原生互操作——我們相信這將簡化對 C、Java、Kotlin、ObjectiveC 或 Swift 中可用的平台特定 API 的存取。
  • 開發人員生產力增強: 我們正在繼續發展我們的開發人員工具,透過探索潛在的新的 UI 設計功能,這些功能可能會提供實時 Widget 預覽器以及實時視覺屬性編輯。
  • 簡潔易讀的程式碼: 為了提高開發人員的生產力,我們正在探索如何使 Flutter 程式碼更快地編寫和更容易閱讀。這包括潛在的新的語言功能,例如「主要建構函式」和「列舉簡寫」,並瀏覽 Flutter 框架以識別可能提供更簡潔的編寫常用程式碼方式的新 API。

正如 Rivers 如此準確地說的那樣,事情確實 “變得更流暢、更專業了一些”,我們的目標是讓事情在未來繼續保持這種感覺。

準備好在生產中使用 #FlutterInProduction 了嗎?

如果您最近沒有嘗試過 Flutter,那麼現在就是最佳時機!

想先了解別人的經驗嗎?

我們致力於透過始終如一地關注品質和效能來贏得您的信任。我們繼續根據使用者的需求來推動我們的路線圖。在過去 6 年的增長期中,這也發生了變化,從實驗時代的個人和業餘愛好者,到如今利用 Flutter 處理業務關鍵功能的大型企業。

與往常一樣,我們迫不及待地想看看您接下來會建構什麼。下次再見!


慶祝 Flutter 的「生產時代」 最初發佈在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

【文章翻譯】Announcing Flutter AI Toolkit

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

宣佈 Flutter AI 工具包

Flutter AI 開發者們,歡呼吧!將 AI 支援的聊天體驗新增到您的應用程式中變得更加容易。隆重推出 Flutter AI 工具包,這是一組隨時可用的 AI 聊天 Widget,旨在無縫整合到您的 Flutter 專案中。無需再從頭開始構建複雜的聊天介面 - Flutter AI 工具包提供了快速輕鬆地將精密的 AI 聊天視窗新增到您的應用程式所需的一切。準備好提升跨多個平台的客戶參與度和滿意度了嗎?您已經準備好了!

在 Project IDX 中試用 Flutter AI 工具包!

多輪聊天

透過多輪聊天,您可以在同一個會話中的多個互動之間維持上下文。

想像一下您正在與朋友交談。他們問您是否有寵物,您告訴他們您有一個名叫 Rocky 的寵物石頭。過了一會兒,在與您聊了其他事情之後,您的朋友問:「您養 Rocky 多久了?」朋友記得您之前談話中提到的寵物石頭,即使您沒有再次提及它。

這基本上就是多輪聊天的作用!它可以幫助大型語言模型 (LLM) 記住正在談論的內容。

Flutter AI 工具包中的多輪聊天

富文本顯示

LLM 生成的回應支援富文本格式。LLM 不僅可以生成純文字,還可以將文字格式化,使其更有趣。例如,回應可以包含粗體文字、圖片、項目符號等等。

Flutter AI 工具包中的富文本格式支援

語音輸入

語音輸入可用於將訊息轉換為文字。此免持選項非常適合那些不喜歡打字或想要更快地撰寫訊息的人。

Flutter AI 工具包中的語音輸入支援

多媒體附件

圖片、影片、音訊、PDF 和其他檔案可以單獨或一起新增到對話中。

Flutter AI 工具包中的多媒體附件支援

自訂回應 Widget

為回應設計專門的 UI 元件。例如,如果有人要求食譜,您可以顯示一個互動式食譜卡,並提供將食譜直接儲存到資料庫的選項。

Flutter AI 工具包中的自訂 AI 回應 Widget 支援

自訂樣式

設定聊天外觀以符合您的應用程式。變更聊天氣泡的顏色、背景、UI 字體,甚至新增 UI 圖片或動畫以反映您的品牌識別。

Flutter AI 工具包中的自訂樣式支援

跨平台支援

Flutter 支援許多平台,Flutter AI 工具包也支援。想要在 iOS、Android、Web 和 macOS 上部署使用 Flutter 製作的 AI 聊天應用程式嗎?沒問題!

可插拔的 LLM

無論您是想使用 Google 的 Gemini 或 Vertex AI,還是其他 LLM,Flutter AI 工具包都可以輕鬆地將 AI 新增到您的應用程式中。GeminiProvider 和 VertexProvider 可用於開箱即用的整合,分別使用 Google AI Dart SDKFirebase 中的 Vertex AI SDK。我們強烈建議您將 Firebase 中的 Vertex AI SDK 用於原型設計以外的生產使用案例。此外,您可以利用 Flutter AI 工具包的 LLM 提供者介面,使用您自己的自訂程式碼插入您選擇的 LLM。

具有多個對話的獨立聊天應用程式

構建一個功能齊全的聊天應用程式,可以儲存和管理多個對話。為了幫助您入門,Flutter AI 工具包附帶了一個範例專案,該專案利用了 Cloud Firestore 資料庫和 Firebase 中的 Vertex AI

Flutter AI 聊天應用程式

立即試用 Flutter AI 工具包

要親自試用 Flutter AI 工具包,請查看 pub.dev 上的 Flutter AI 工具包 以及以下資源:


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