0%

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

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

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

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

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

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

背景

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

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

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

展望未來

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

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

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

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

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


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

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

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

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

Flutter 的影片和網頁廣告支援

共同作者:Zoey Fan、Harold Benson、Alak Jhunjhunwala

將您的 Flutter 應用程式變現變得更容易,也更有價值。今天,我們很高興地宣布一套新的工具和功能更新,為開發人員提供一系列選項來將您的應用程式變現並發展您的業務。

Flutter 開發人員現在可以使用影片廣告

顯示範例影片廣告的動畫 gif

讓我們先將您的影片內容轉變為創造收入的強大引擎!

我們要宣布推出 Flutter 的互動式媒體廣告 (IMA) Plugin。您現在可以將高品質的影片廣告無縫整合到 iOS 和 Android 上的 Flutter 應用程式中。這意味著您現在可以在影片內容播放之前(片頭廣告)、期間(中間廣告)或之後(片尾廣告)輕鬆地透過影片廣告將影片內容變現。就像 Google 行動廣告 Plugin 簡化了 Flutter 應用程式中行動廣告的顯示一樣,IMA Plugin 讓您輕鬆地整合影片廣告。我們已經完成了繁重的工作,因此您可以專注於最重要的事情:創造令人驚嘆的應用程式體驗。

輕鬆整合,最大限度地發揮影響力

  • 客戶端廣告插入: 廣告在單獨的影片播放器中播放,確保為您的使用者提供流暢的觀看體驗,同時讓您擁有更多控制權。
  • 無縫廣告處理: Plugin 請求影片廣告並處理播放。它還確保渲染跳過按鈕等 UI 元素,並觸發廣告測量訊號。
  • 符合產業標準: IMA 利用產業標準的影片廣告投放範本 (VAST) 規範,確保與廣告伺服器的廣泛相容性。
  • 存取優質廣告需求: IMA 確保您可以透過 Google 的高品質和優質影片廣告需求來將您的影片內容變現。

立即開始!

您準備好使用影片廣告為您的 Flutter 應用程式增壓了嗎?前往 pub.dev/packages/interactive_media_ads 以探索 IMA Plugin 並存取詳細的文件。您將找到開始使用所需的一切,包括程式碼範例和逐步指南。我們很期待看到您如何使用 IMA Plugin 將您的 Flutter 影片內容變現,並創造更具吸引力的應用程式體驗!

Beta 版:使用 AdSense 廣告將您的 Flutter 網頁遊戲變現

顯示遊戲中範例 AdSense 廣告的動畫 gif

許多 Flutter 開發人員希望像他們的行動應用程式一樣,將他們的 Flutter 網頁專案變現。我們一直在幕後忙碌地工作,並且有一些令人興奮的進展可以分享!

今天,我們很興奮地宣布 H5 遊戲 Plugin 的 AdSense beta 計劃!透過此 Plugin,您可以輕鬆地將 AdSense H5 遊戲廣告 加入到您在 Flutter 中建立的網頁遊戲 (H5) 中,開闢新的收入來源。

beta 計劃提供的內容:

  • 成為首批整合 AdSense 的人之一:搶先體驗 Flutter AdSense Plugin,並開始試驗不同的廣告格式。
  • 塑造 Plugin 的未來:提供寶貴的回饋,並幫助我們根據 Flutter 網頁開發人員的特定需求定制 Plugin。

此計劃是邁向 Flutter 網頁完整廣告變現解決方案的重要一步。目前,此 Beta 計劃的重點是為 Flutter 網頁遊戲 啟用 AdSense。我們正在與 AdSense 團隊合作,為未來的 Flutter 網頁應用程式開發解決方案。

如果您是 Flutter 網頁 遊戲 開發人員,並且有興趣參與,請填寫 H5 AdSense 申請表。一旦您獲准加入 beta 計劃,請使用 pub.dev/packages/google_adsense 開始使用!

透過深度連結提高轉換率和更好的使用者體驗

加入廣告是成為成功企業的方法之一。有時您的企業需要在應用程式中銷售商品和服務。您可能已經花費了大量的時間和資源來建立簡訊/電子郵件行銷和廣告活動,並希望這些活動能夠帶來有效的轉換。但是,如果您能透過將客戶從行銷活動直接引導到您的應用程式以及他們感興趣的特定項目,從而將您的活動提升到新的水平呢?

透過 Flutter 中的 深度連結,您可以做到這一點。當有人點擊您活動中的連結時,他們將被直接帶到您的應用程式以及您正在推廣的產品或服務。與連結到您的網站相比,這種無縫的轉換將 轉換的機率提高了 2.3 倍

以下是深度連結對廣告商來說改變遊戲規則的原因:

  • 提高轉換率: 透過將客戶直接帶到您的應用程式,您可以消除干擾,並讓他們更容易完成購買。
  • 個人化體驗: 深度連結允許您為每個客戶創造個人化體驗。當他們點擊連結時,他們將被帶到他們感興趣的特定產品或服務。
  • 追蹤活動績效: 透過深度連結,您可以追蹤活動的有效性,並查看有多少人點擊連結到您的應用程式。這些資料可以幫助您優化活動以獲得更好的結果。

雖然深度連結提供了所有這些優點,但設定起來可能相當麻煩。因此,我們也讓深度連結比以往任何時候都更加穩健和可靠。透過 Flutter DevTools 中 iOS 和 Android 的完整 網頁和應用程式檢查驗證支援,您可以確保您的深度連結已正確且安全地設定。您的使用者將享受網頁和應用程式內容之間的無縫轉換,增加參與度和滿意度!首先,前往 Flutter DevTools,並打開深度連結驗證標籤。

顯示 Flutter DevTools 中深度連結驗證的動畫 gif

我們致力於為您(Flutter 開發人員)提供您成功所需的工具和資源。這些新功能證明了我們的承諾。所以,繼續,將您的 Flutter 應用程式提升到新的高度,並釋放其全部潛力!

探索更多:


Flutter 中的影片和網頁廣告支援 最初發佈在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

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

宣佈 Dart 3.6

歡迎來到 Dart 3.6!今天,我們發佈了今年的最後一個版本,與 Flutter 3.27 一起推出。我們很高興在語言中分享一個新功能:數字分隔符。我們在 pub 生態系統中也有一些新功能:pub 下載次數 以及備受期待的 pub 工作區

Dart 3.6

Pub 工作區

Pub 現在支援在 monorepo 或工作區中的套件之間共用解析。工作區是一組緊密相關的套件,它們一起開發、解析和發佈。

pub 工作區功能可確保 monorepo 中的套件共用一組一致的相依性。這會強制您 在出現時 解決分組套件之間的相依性衝突,而不是在開始使用套件時才面對混亂。

Flutter 分析器會在單個分析上下文中處理 pub 工作區中的所有套件,這與以前每個套件單獨使用一個上下文的行為不同。對於大型儲存庫,這可以顯著減少 Dart 語言伺服器消耗的記憶體量,從而提高 IDE 效能。

要定義 pub 工作區,請在根 pubspec.yaml 檔案中加入 workspace 欄位,並列出相關套件,如下例所示:

1
2
3
4
5
6
7
8
name: _
publish_to: none
environment:
sdk: ^3.6.0
workspace:
- packages/helper
- packages/client_package
- packages/server_package

然後在儲存庫中的任何位置執行 pub get 以完成映射和剩餘的檔案管理。

要使用 pub 工作區,所有工作區套件(但非相依性)必須具有 ^3.6.0 或更高版本的 SDK 版本約束。

有關更多資訊,包括完整的詳細說明和邊緣案例涵蓋範圍,請查看 Pub 工作區(monorepo 支援) 頁面。

Pub 下載次數

我們聽取了您對 pub.dev 上更精確指標的 請求,現在下載次數就在這裡!下載次數取代了單個套件頁面上之前的「人氣分數」。除了新的指標之外,您還將在每個頁面上找到一個迷你圖表,顯示每週的下載次數。

螢幕截圖突出了 pub.dev 上新的下載次數和迷你圖表

您可以在 pub.dev 評分文件 中了解更多關於下載次數的資訊。

數字分隔符

Dart 語言現在允許使用底線 (_) 作為數字分隔符,這有助於提高長數字字面量的可讀性。多個連續的底線表示更高級別的分組。以下是一些 Dart 中有效使用數字分隔符的範例:

1
2
3
4
1__000_000__000_000__000_000
0x4000_0000_0000_0000
0.000_000_000_01
0x00_14_22_01_23_45

請記住,數字分隔符僅在數字 之間 有效,因此不允許使用 100_、0._000_1 或 1.2e_3 之類的字面量。始終如一地使用數字分隔符也很重要,因此請確保數字組在每個級別的組之間大小相同。

要使用數字分隔符,您需要將套件中的最低 SDK 提升至 3.6.0 或更高版本。

結語

今天就到這裡。有關 Dart 團隊在本季度所做工作的完整故事,請查看 3.6.0 的變更日誌。別忘了查看 Flutter 3.27 版本部落格 文章以獲取更多更新。明年見!


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

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

使用 Impeller、Cupertino 更新等提升應用程式開發

簡介

讓我們深入了解 Flutter 3.27!此版本充滿了增強功能和特性,著重於改進您的開發體驗並提升應用程式的效能。

我們在架構、引擎和生態系統方面都進行了更新,包括 Impeller 的進展和 Cupertino widget 的改進。此外,我們還在 DevTools 中引入了令人興奮的新功能,讓管理 Flutter 專案比以往任何時候都更容易。Flutter 3.27 包含來自 187 位貢獻者(包括 49 位首次貢獻者!)的超過 1,400 個提交,證明了 Flutter 社群令人難以置信的活力和合作。讓我們一起探索新功能吧!

架構

Cupertino 更新

此版本包含對 CupertinoCheckboxCupertinoRadio 的高保真度更新,其中包括對大小、顏色、筆劃寬度和按下時的行為的更新。CupertinoRadioCupertinoCheckboxCupertinoSwitch 也進行了大量的可自訂性更新,加入了滑鼠游標、語義標籤、縮圖和填充顏色等屬性。某些屬性(例如 CupertinoCheckbox 的非活動顏色)已被棄用,而其他屬性(例如 CupertinoSwitch 的軌跡顏色)則已重新命名。這些變更使這些 widget 與其 Material 對應項的功能齊平。

CupertinoSlidingSegmentedControl 的拇指半徑、分隔線高度、填充、陰影和拇指縮放對齊方式也進行了一些保真度更新。它現在還支援停用個別區段,以及根據區段內容進行比例佈局。

感謝社群成員 @veloce 的出色貢獻,CupertinoNavigationBarCupertinoSliverNavigationBar 的背景現在是透明的,直到內容在其下方捲動。

這使得 sliver 導航欄在其展開狀態下可以擁有與其背景相同的顏色,但在其摺疊狀態下可以擁有不同的可自訂顏色(並且能夠在捲動時在這兩種顏色之間進行插值)。

感謝社群成員 @kerberjg 的出色貢獻,您現在可以使用 CupertinoButton 中新的 sizeStyle 屬性,透過新的 CupertinoButtonSize 列舉來應用 iOS 15+ 按鈕樣式。使用新的 CupertinoButton.tinted 建構函式來製作具有半透明背景的按鈕。

CupertinoButton 還有一個新的 onLongPress 處理程式,並且允許透過鍵盤快捷鍵執行操作。

CupertinoPickerCupertinoDatePicker 現在將捲動到點擊的項目。

CupertinoAlertDialog 現在支援點擊滑動手勢。

CupertinoActionSheet 進行了一些高保真度更新,包括在所有系統文字大小設定中調整填充和字體大小,以及在滑過按鈕時支援觸覺回饋。

其他變更包括:CupertinoContextMenu 現在支援捲動(如果其動作超出螢幕範圍),CupertinoDatePicker 不再裁剪其欄中的長內容,以及 CupertinoMagnifier 透過提供放大比例來支援縮放效果。

標準化 Material 主題

在此版本中,CardThemeDialogThemeTabBarTheme 已經過重構,以使其符合 Flutter 的元件主題規範。加入了 CardThemeDataDialogThemeDataTabBarThemeData 來定義元件視覺屬性預設值的覆蓋。未來的版本將繼續標準化像這樣的元件主題,以便在 Material 函式庫中提供更一致的主題體驗。

CarouselView 的更多功能

此版本引入了 CarouselView.weighted,可以在 Carousel 中啟用更動態的佈局。透過調整建構函式中的 flexWeights 參數,您可以實現各種項目佈局。例如,[3, 2, 1] 建立 多瀏覽 佈局,[7, 1] 建立 英雄 佈局,而 [1, 7, 1] 建立 居中英雄 佈局。這些值表示每個項目在 Carousel 視圖中佔據的相對權重,並且可以自訂以滿足使用者的特定需求。

Material 中的更多內容

此版本包含許多小的功能增強和錯誤修復。一些增強功能範例:

  • SegmentedButton 現在有一個 direction 屬性,因此項目可以垂直對齊。
  • ButtonStyleButton 類別(ElevatedButtonFilledButtonOutlinedButtonTextButtonMenuItemButtonSubmenuButton)的 styleFrom 方法中加入了更多與圖示相關的屬性,以允許更多自訂。

一些錯誤修復範例:

  • ButtonStyleButton 類別的圖示大小和顏色預設值與 Material 3 規範一致。
  • AppBar 的捲動下行為現在可以在導航抽屜打開時正確保留,與原生 Android 體驗相符。
  • MenuAnchor 透過焦點修復得到了進一步改進,並且解決了幾個 DropdownMenu 問題,包括巢狀捲動元件中的捲動問題和過濾機制行為。

混合路由轉場

當先前的路由和新的路由具有不同的頁面轉場時,ModalRoutes 現在更加靈活。當新的路由進入螢幕時,有時它們需要先前的現有路由播放特定轉場以與新路由的進入轉場同步。現在,ModalRoutes 可以互相提供退出轉場建構函式,以便進入和退出轉場始終同步。這允許頁面使用 Flutter 的 NavigatorRouter 在一個頁面上具有多個路由轉場選項。

文字選取改進

Flutter 的 SelectionArea 現在支援在 Linux、macOS 和 Windows 上使用 Shift + 點擊手勢將選取範圍的末尾移動到點擊位置。

您現在還可以透過 SelectableRegionState 上的 clearSelection 方法清除 SelectionAreaSelectableRegion 下的選取範圍。現在還可以透過提供 GlobalKey 並存取其 SelectionAreaState.selectableRegion 來透過 SelectionArea 存取 SelectableRegionState

我們還解決了 RenderParagraph 的一些問題,因此在調整 視窗大小 後,以及在點擊或 點擊實際文字 [之外] 時,在 SelectionAreaSelectableRegion 下選取文字仍然可以按預期工作。

Row 和 Column 間距

此版本還提供了一個使用 RowColumn 的新便利方法:spacing!此雙精度參數將應用固定數量的像素來偏移 RowColumn 的子項之間的距離,從而減少先前執行此操作所需的程式碼量。

引擎

Android 上的 Impeller

我們很高興地宣布,Impeller 現在是現代 Android 設備上的預設渲染引擎。雖然自 Flutter 3.16 穩定版本於 2023 年 11 月發佈以來,這些設備上的 Impeller 一直處於預覽階段,但從那時起,我們根據使用者回饋對效能和保真度都進行了重大改進。

在較舊的 Android 設備和不支援 Vulkan 的設備上,仍然會像以前一樣使用 Skia 渲染引擎。雖然我們相信 Impeller 的效能和保真度都非常高,但使用者可以選擇退出並返回到傳統的 Skia 渲染器,方法是將 --no-enable-impeller 傳遞給 flutter 命令列工具,或者將以下內容放入您的 AndroidManifest.xml 檔案中:

1
2
3
<meta-data
android:name="io.flutter.embedding.android.EnableImpeller"
android:value="false" />

接下來,我們將繼續改進 Impeller 在 Android 上的效能和保真度。此外,我們打算讓 Impeller 的 OpenGL 後端做好生產準備,以移除 Skia 後備。

如同在預覽期間一樣,我們請求 Flutter 開發人員升級到最新的穩定版本,並提交在啟用 Impeller 時發現的任何缺點的錯誤。回饋對於確保 Impeller 在 Android 上取得成功仍然至關重要。Android 硬體生態系統比 iOS 生態系統更加多元。因此,關於 Impeller 最有用的回饋應包括有關發生問題的特定設備和 Android 版本的詳細資訊。

iOS 設備的改進

在以前的 Flutter 版本中,使用者可能會遇到 一個問題,即 iOS 設備上的應用程式在合成器反壓下每幀等待幾毫秒。這種反壓將被視為柵格工作負載開始時的延遲。在許多情況下,這種延遲會導致畫面丟失和卡頓。這種效應在具有較小畫面時間預算的高畫面播放速率設備上尤為明顯。

在此版本中,開源貢獻者 @knopp 加入了一個 新的實作 Metal 渲染表面,允許柵格工作負載在 UI 工作負載完成後更一致地開始。這意味著使用者將觀察到整體畫面時間更加穩定,因為在 iOS 系統合成器上的等待時間更少。特別是,Flutter 現在將在高畫面播放速率設備上更一致地達到 120Hz。在我們的基準測試中,我們觀察到在許多情況下平均畫面柵格化時間都大幅減少了。

此圖表顯示在 iPhone 11 設備上運行的許多不同基準測試中,平均畫面柵格化時間(以毫秒為單位)全面下降。

架構廣色域顏色

Flutter 現在支援使用 DisplayP3 色彩空間中的顏色來定義 UI,以充分利用 iOS 設備上的顯示器。它還具有更寬的位元深度,以支援 sRGB 和 DisplayP3 色彩空間中的更多顏色。此變更導致一些 Color 方法被棄用;更多資訊可以在 重大變更通知 中找到。

Web

Web 改進

此版本為 Flutter Web 帶來各種改進,著重於效能、效率和輔助功能:

  • 現在,Safari 和 Firefox 中的圖像解碼使用 <img> 元素完成,而不是對所有靜態圖像使用 WebAssembly 編解碼器。這消除了與圖像解碼相關的卡頓,並減少了 WASM 記憶體使用量。
  • 平台視圖經過優化,以減少畫布覆蓋層的數量,從而提高渲染效率。
  • Flutter 團隊開發的所有插件和套件現在都與 WebAssembly 相容。
  • 對標題、對話框、密碼、iOS 鍵盤、連結和捲動元件實作了多項輔助功能修復。
  • 在 CanvasKit 和 Skwasm 渲染器中修復了許多渲染錯誤,包括圖像濾鏡、裁剪和 Paint 物件的記憶體使用量。
  • 改進了多視圖模式下的拖動捲動。

iOS

Swift Package Manager

Flutter 正在遷移到 Swift Package Manager。這帶來了許多好處:

  1. 存取 Swift 套件生態系統。Flutter 插件將能夠利用不斷發展的 Swift 套件 生態系統!
  2. 簡化 Flutter 安裝。Swift Package Manager 與 Xcode 捆綁在一起。未來,您將不再需要安裝 Ruby 和 CocoaPods 來為 Apple 平台使用 Flutter。

以前,Swift Package Manager 支援僅在 Flutter 的「main」頻道上可用。我們很高興地宣布,Swift Package Manager 功能現在也在「beta」和「stable」頻道上可用!目前,Swift Package Manager 功能預設為關閉,因為我們正在解決一些問題。

鼓勵插件作者將 Swift Package Manager 支援加入到您的插件中。許多流行的插件——包括 Firebaseplus 插件更多——已經遷移到 Swift Package Manager!

Pub.dev 現在會檢查插件的 Swift Package Manager 相容性。未來,不相容的套件將不會獲得完整的套件評分。

如果您對 Flutter 對 Swift Package Manager 的支援有任何回饋,請 提交問題

Android

邊緣到邊緣

在運行 Android 15+ 的設備上,您的應用程式預設將使用邊緣到邊緣模式並以全螢幕運行!有關此變更以及如何選擇退出此行為的詳細資訊,請參閱指南

支援 Freeform

Android Freeform 允許使用者調整應用程式視窗的大小,並且一直作為開發人員選項提供。Flutter 的 SafeAreaMediaQuery 已更新,以便在 freeform 視窗移動到硬體缺口時處理硬體缺口。

Kotlin 建置腳本支援和宣告式插件遷移

開發人員現在可以使用 build.gradle.kts 檔案。Flutter 工具現在支援 Kotlin 建置檔案。如果您遇到我們不支援 Kotlin 的地方,請提交錯誤。Groovy 仍然是支援的 Gradle 語言。

Flutter 3.27 是最後一個支援 Gradle 的傳統 apply 腳本方法 的版本。請參閱遷移文件

注意:大多數應用程式需要手動遷移。新建立的應用程式將 使用 kotlin 建置檔案

遷移到 Flutter Gradle 插件的宣告式包含有助於 Flutter 遷移到 Kotlin 建置檔案,從而提高類型安全性,並更容易維護建置程式碼的單元測試。這也是在 Android 工具版本之間帶來更多穩定性的一項更廣泛工作的一部分。

生態系統

Flutter 和 Dart 套件生態系統峰會美國 2024

作為 2024 年 9 月 Fluttercon USA 的一部分,我們舉辦了 Flutter 和 Dart 套件生態系統峰會。這是我們的第二次現場峰會,繼 2024 年 7 月 Fluttercon Europe 的峰會和我們於 2023 年 8 月舉辦的第一屆虛擬峰會之後。請參閱此處的討論會重點摘要 連結

峰會匯集了套件作者和維護者,進行了以下主題的非會議式會議:

  • 會議 1 - 加入對 Swift Package Manager 的支援
  • 會議 2 - 原生互操作的過去、現在和未來
  • 會議 3 - 可持續的套件維護模型

我們期待與社群合作,在未來舉辦更多此類峰會。

pub.dev 上的套件下載次數

我們在 pub.dev 上推出了下載次數指標!

pub.dev 上提供更精確的受歡迎程度指標一直是該網站問題追蹤器中 請求最多的 功能。

現在,當您查看套件頁面時,您將看到一個 30 天下載次數,取代了以前的「受歡迎程度分數」。

此外,我們還加入了一個互動式折線圖,顯示隨著時間推移的每週下載活動。此圖表可幫助開發人員和套件作者發現套件使用趨勢。例如,它可能表明新版本導致使用量激增,或者套件正在變得越來越流行或越來越不受歡迎。

每次從 pub.dev 下載套件時都會註冊下載次數。例如,當您運行 flutter pub get 且套件尚未在您的 pub 快取中時。

顯示的下載次數是原始下載次數,反映了來自 CI 系統、套件分析、人工 pub 用戶端使用者等的使用情況。

Pub 工作區

我們將在 Dart 3.6 中推出 Pub 工作區,以支援在一個 monorepo 中開發多個相關套件。

透過定義引用儲存庫中其他套件的根 pubspec,在儲存庫中的任何位置運行 pub get 將會為所有套件產生共用解析。這可確保所有套件都使用一組一致的相依開發。

分析器也會選取共用解析,現在分析器只需追蹤整個工作區的單個分析上下文,從而可能在 IDE 中打開整個儲存庫時顯著減少記憶體使用量。

從 GitHub 自動發佈 Flutter 套件

我們擴展了 setup-dart 發佈 Github Actions 工作流程,還允許將 Flutter 套件 自動發佈 到 pub.dev,從而更容易以可驗證的方式為 Pub 生態系統做出貢獻。

推出互動式媒體廣告插件

我們推出了 互動式媒體廣告 (IMA) Flutter 插件,可以輕鬆地將多媒體廣告整合到使用 Flutter 建置的 iOS 和 Android 應用程式中。IMA 插件可以從任何符合 VAST 標準的廣告伺服器請求廣告,並在您的應用程式中管理廣告播放。廣告在位於應用程式內容影片播放器頂部的單獨影片播放器中播放。目前支援的功能包括:

  • 線性串流影片廣告請求的用戶端 API
  • VAST 和 VMAP
  • 單個和 Podded 請求
  • 可跳過廣告

應用程式內購買 iOS 和 macOS 插件更新

我們已將 StoreKit 2 支援加入到 in_app_purchase_storekit 套件中,以從 iOS 18 中棄用的 StoreKit 1 API 遷移。這使我們能夠在未來加入新的 StoreKit 2 功能,例如更好的訂閱管理。敬請期待即將推出的遷移指南,以説明您轉換到新的 StoreKit 2 功能。這是一個非重大變更,因此您可以隨時遷移。

DevTools 和 IDE

Flutter DevTools 更新

此版本包含新功能、整體穩健性和完善性改進,以及一些令人興奮的新的實驗性功能,您可以從 DevTools 中啟用這些功能。有關這些功能的更多資訊,請參閱下面的「預覽和實驗性功能」部分。

首先,我們在 Flutter Deep Links 工具中加入了對驗證 iOS 深度連結設定的支援。您現在可以驗證 Android 和 iOS 的深度連結。

DevTools Deep Links 工具中的 iOS 深度連結驗證。

接下來,我們對使用「離線」資料的工作流程進行了一些改進。有時需要將您在 DevTools 中查看的資料匯出以供將來使用或載入到其他工具中。此版本加入了將網路資料匯出為 .har 檔案的支援,以及將記憶體快照載入到 DevTools 中以便在 DevTools 未連線到正在運行的應用程式時查看的支援。

此外,如果您曾經在使用 DevTools 除錯記憶體問題時因為應用程式崩潰(可能是由於您正在嘗試除錯的 OOM 問題)而丟失了記憶體工具資料,我們感同身受!我們已透過允許您即使在應用程式斷開連線後仍然可以在 DevTools 中繼續查看最新的記憶體工具資料來修復此使用者體驗痛點。

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

預覽和實驗性功能

Flutter DevTools - 新的 Flutter Inspector

Flutter Inspector 已經過一些重大變更,以提高可用性並增強您的 UI 除錯體驗。透過切換「新的 Inspector」設定來啟用新的 Inspector。

DevTools 中的新 Flutter Inspector。

一些變更包括:

  • 簡潔的 Widget 樹,可以更輕鬆地查看深度巢狀的 Flutter widget 樹。當從 IDE 中使用 Flutter Inspector 時,這尤其有用,因為水平螢幕空間有限。
  • 一個選項,用於切換是否應在 widget 樹中包含實作 widget。實作 widget 是您未在應用程式程式碼中包含的 widget,而是由 Flutter 架構或其他套件加入到 widget 樹中的。
  • 選定 widget 的詳細資訊視圖,顯示內聯佈局查看器、widget 和渲染物件屬性,以及 Flex widget 及其子項的 Flex 佈局資源管理器。

新的 Inspector 很快就會有更多改進,但這些變更已經可以試用了!請提交您遇到的任何 問題,以便我們在預設啟用新的 Inspector 之前修復它們。

Flutter DevTools - 使用 WebAssembly 進行嘗試

在 DevTools 設定中啟用 WebAssembly 功能,以載入 WASM 編譯的 DevTools Web 應用程式。

這應該比預設的 JS 編譯版本的 DevTools 產生更好的效能。此功能是實驗性的,因此請提交您在 WASM 建置中遇到的任何 問題

DevTools 設定,用於使用 WebAssembly 建置而不是 Javascript 建置。

重大變更和棄用

Material Design 3 標記

最新的 Material Design 3 標記 (v6.1) 已應用於 Flutter Material 函式庫。Material Design 標記更新了僅在亮模式下 4 種顏色角色的映射,以在保持可存取對比度的同時更具視覺吸引力。我們在測試此變更時沒有發現任何損壞,此變更應用於以下顏色屬性:

  • 主要容器上(Primary10 到 Primary30)
  • 次要容器上(Secondary10 到 Secondary30)
  • 三級容器上(Tertiary10 到 Tertiary30)
  • 錯誤容器上(Error10 到 Error30)

這會影響使用這些角色作為其預設值的 Widget。

晶片(ChipActionChipChoiceChipFilterChipInputChip)的邊框顏色已從 ColorScheme.outline 更新為 ColorScheme.outlineVariant。這改善了晶片和按鈕之間的視覺層次結構。

Objective-C iOS 專案

自 2019 年 Flutter 1.9.1 發佈以來,新的 iOS 專案預設使用 Swift。建立 新的 Objective-C iOS 專案現在已被棄用,並且 flutter create --ios-language objc 標誌將在 Flutter 的未來版本中移除。您仍然可以打開 Xcode 專案並加入 Objective-C 檔案,包括插件的檔案。Java 繼續透過 flutter create --android-language java 標誌支援 Android 應用程式。

深度連結預設標誌

Flutter 的深度連結標誌的預設值已從 false 變更為 true,這意味著深度連結現在預設為選擇加入。如果您使用 Flutter 的預設深度連結設定,則不再需要手動將標誌設定為 true

但是,如果您使用協力廠商插件進行深度連結,例如:

此更新將引入重大變更。在這種情況下,您需要手動將 Flutter 深度連結標誌重置為 false

有關更多詳細資訊,請參閱設計文件:flutter.dev/go/deep-link-flag-migration

在 IDE 中棄用對較舊 SDK 的支援

為了確保我們能夠繼續提供高品質的開發人員體驗,我們正在對 IDE 插件支援進行變更。隨著 VS Code 和 IntelliJ 的 Dart 和 Flutter 插件的發展,支援較舊的 Dart SDK 版本變得越來越具有挑戰性。

從 Dart 3.6 發佈開始,我們將棄用對早於 3.0(於 2023 年 5 月發佈)的 Dart SDK 版本的支援。這意味著雖然這些工具可能仍然可以使用較舊的 SDK,但我們將不再為特定於這些版本的問題提供官方支援或修復。

隨著 Dart 3.7(預計在 2025 年第一季度)的發佈,我們將完全移除對這些較舊 SDK 版本的支援。這些插件的未來版本可能與這些版本不相容。

這對您意味著什麼?

  • 如果您使用的是較舊的 Dart SDK,我們鼓勵您升級到 3.0 或更高版本,以繼續接收支援和更新。
  • 此變更影響不到我們 1% 的使用者,它將使我們能夠專注於為絕大多數開發人員提供最佳的體驗。

結束語

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

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

結論

非常感謝整個 Flutter 社群使此版本成為可能!您的貢獻、回饋和熱情是推動 Flutter 向前發展的動力。我們對 Flutter 的未來感到無比興奮,並迫不及待地想看到您使用 Flutter 3.27 建置的出色應用程式。

有關所有變更的完整概要,請查看詳細的 發行說明和變更日誌。準備好體驗最新最好的功能了嗎?只需運行 flutter upgrade 並開始建置!


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

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

收看 #FlutterInProduction - 即將在您附近的螢幕上播出!

在您的日曆上標記,並務必在 2024 年 12 月 17 日 太平洋時間上午 11:00 / 東部時間下午 2:00 / 中歐時間晚上 8:00 收看 #FlutterInProduction

這個在 Flutter YouTube 頻道 上舉辦的線上活動與我們之前的活動略有不同。我們不僅會深入探討最新版本(儘管我們一定會這樣做!):#FlutterInProduction 還將慶祝我們作為一個社群共同走過的不可思議的旅程,使 Flutter 成為今天這個強大的、可投入生產的框架。

預期內容

  • #FlutterInProduction:無論您是經驗豐富的專業人士還是剛剛起步,您都將從 Flutter 使用者故事中獲得新的見解和靈感,從 Flutter 技術負責人那裡了解更多關於最新功能的資訊,並在此多環節線上活動中了解 Flutter 應用程式開發的未來。
  • #AskFlutter 線上問答:從 Flutter 團隊負責人那裡獲得您的問題的解答。請持續關注我們在社群媒體上的徵集問題!
  • Observable Flutter:對在企業開發環境中使用 Flutter 構建有什麼疑問嗎?從在生產中使用 Flutter 的公司的技術負責人那裡獲得這些問題的解答。

保持關注

我們將會有一些驚喜和公告,因此請務必採取以下步驟以保持了解最新資訊。

  1. 在您的日曆上或在 YouTube設定提醒,了解活動時間。
  2. TwitterLinkedIn 或此處的 Medium 上關注我們!

我們迫不及待地想與您分享 #FlutterinProduction


收看 #FlutterInProduction - 即將在您附近的螢幕上播出! 最初發佈在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

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

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

Prospera:使用 Flutter 將 AI 帶到銷售前線

Gemini graphic

世界各地的開發人員正在使用 Google 的 Gemini 模型來應對現實世界的挑戰,而我們看到最令人興奮的應用之一就是在銷售領域。認識 Prospera,它在我們最近的 Gemini API 開發者競賽 中獲得了 最佳 Flutter 應用程式最有用的應用程式 兩項大獎!Prospera 由來自德國的 Leon Kukuk 和 Max Hasenohr 共同開發,它是一款 AI 驅動的銷售教練,可在通話期間和通話後提供即時指導和回饋。這款創新的 Flutter 應用程式展示了 Gemini 如何改變銷售專業人員學習和提升技能的方式。

Gemini API 作為核心:即時分析和多模態魔法

Prospera 以真正獨特的方式利用 Gemini 的多模態功能。透過將語音對話片段直接輸入 Gemini API 的 Python SDK,該應用程式可以從經驗豐富的銷售教練的角度提供即時回饋。想像一下,在您通話期間,有一個 AI 副駕駛會提供有價值的見解和建議——這就是 Prospera 的力量。

但他們是如何實現這種無縫整合的呢?Prospera 的開發者 Leon 巧妙地使用了 Dart FFI(外部函數介面)和 ffigen 套件,為 PJSIP C 函式庫建立了 Dart 繫接,從而在 Flutter 中實現了無縫的電話整合,並允許透過 Gemini API 處理這些通話。這使他們能夠即時處理音訊資料,並向銷售代表提供即時回饋。

「Gemini 對語音的細緻理解給我們留下了深刻的印象,這要歸功於其多模態音訊功能以及易於實作的特性。Flutter 使我們能夠以驚人的速度開發跨平台應用程式,同時提供了透過 FFI 和平台通道運行原生程式碼的強大機會。」——Leon

適用於所有平台的 Flutter 應用程式

Prospera 使用 Flutter 構建,可以從單一程式碼庫在各種桌面平台上無縫運行。這不僅簡化了開發,還為未來擴展到行動裝置打開了大門,讓更廣泛的受眾可以使用該應用程式。開發人員還密切關注使用者體驗,使用 Material Design Widget 製作了一個設計精美的應用程式,並確保了完全的無障礙使用。

超越銷售:展望溝通的未來

透過將 Gemini 的強大功能與 Flutter 的多功能性相結合,Leon 和 Max 開發了一款有可能徹底改變我們學習、互動和在職業生涯中脫穎而出的方式的應用程式。Prospera 不僅僅是一個銷售教練;它讓我們看到了 AI 如何增強人類溝通和專業發展的未來。雖然 Prospera 專注於銷售指導,但其底層技術和方法具有更廣泛的應用。分析即時對話並提供建設性回饋的能力在各種以溝通為導向的職業中都很有價值,例如客戶服務和教育。

想了解更多關於 Dart FFI 以及它如何增強您的 Flutter 應用程式的資訊嗎?請在 pub.dev 上查看 ffigen 套件。


Prospera:使用 Flutter 將 AI 帶到銷售前線 最初發佈在 Flutter 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。