【文章翻譯】Announcing Dart 3.14

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

原文:https://dart.dev/blog/announcing-dart-3-14

宣布 Dart 3.14

藉由自動化 SDK 遷移、更快的 WebAssembly 和重新設計的 DartPad,讓 Dart 工作流程臻於完美。

Chef Dash pulling a freshly baked pie with the Dart logo from an oven next to glowing 3.14 numbers.
宣布 Dart 3.14

我們很高興宣布 Dart 3.14!

與我們的 pi 版本相符,Dart 3.14 讓開發人員工作流程臻於完美,從在瀏覽器中嘗試想法到建構跨平台應用程式以及升級您的套件以迎接下一個版本。您可以在重新設計的 DartPad 中測試想法和 pub.dev 套件,使用 dart migrate 自動在 SDK 版本之間遷移程式碼庫,使用硬體 SIMD 提升 WebAssembly 效能,在瀏覽器外執行 Wasm 模組,並透過穩定的 FFIgen 和 JNIgen 支援呼叫原生平台 API。

所以 更新 Dart 或執行 flutter upgrade 並跟隨我們探索 Dart 3.14 中的新功能!當您準備好查看 UI 框架中的新功能時,請查看配套的 Flutter 3.50 新功能 部落格文章。

工具更新

使用 dart migrate 工具自動化套件升級

將 Dart 套件更新到較新的 SDK 版本通常涉及提高其 SDK 限制並更新程式碼以符合新的樣式建議或防止與即將到來的版本發生中斷。然而,弄清楚要啟用哪些 lint 或每個版本需要哪些程式碼變更可能很棘手。

為了消除跨版本升級的猜測,新的 dart migrate 工具透過一次將套件向前推進一個版本來自動化此工作流程。對於每個版本,它將:

  1. 準備您的套件,方法是應用需要在版本升級之前執行的 dart fix 修正。
  2. 提高 pubspec.yaml 中 SDK 限制的下限。

一旦您的套件在新版本上,您可以選擇透過應用使用新功能或符合新樣式建議的修正來清理它。

例如,在 SDK 限制為 ^3.12.0 的套件中:

1
2
3
4
5
6
7
class WeakPasswordException implements Exception {}

void checkPassword(final String password, final int minLength) {
if (password.length < minLength) {
throw WeakPasswordException();
}
}

該工具透過從參數中刪除 final 來準備程式碼,這在 Dart 3.13 中是一個編譯時錯誤。它提高了 pubspec 中的 SDK 限制,然後透過採用空類別的新分號主體語法來清理它:

1
2
3
4
5
6
7
class WeakPasswordException implements Exception;

void checkPassword(String password, int minLength) {
if (password.length < minLength) {
throw WeakPasswordException();
}
}

完成執行後,migrate 工具會報告每個步驟的編輯摘要,以及套件仍可應用的可選清理修正:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
my_package:
3.12.0 -> 3.13.0:
Preparatory changes:
2 changes made in 1 file.

my_package/lib/password.dart
avoid_final_parameters • 2 changes

SDK constraint:
Bumped ^3.12.0 -> ^3.13.0

Optional cleanup fixes can modernize your code further:

my_package: 1 change in 1 file
empty_container_bodies • 1 change

To preview them, run 'dart pub get' and then 'dart migrate --dry-run --step=cleanup' on the same packages.

若要預覽套件的變更,請使用 --dry-run 旗標:

1
dart migrate --dry-run

若要應用建議的變更,請使用 --apply 旗標:

1
dart migrate --apply

對於可能希望在提高 SDK 限制之前或之後審查修正的大型程式碼庫,您可以使用 --step 旗標執行特定步驟:

1
2
3
4
5
# 只執行準備性修正,不提高限制
dart migrate --apply --step=prepare

# 應用準備性修正後,提高限制並應用清理修正
dart migrate --apply --step=bump,cleanup

預設情況下,執行該工具會將套件版本提高一個次要版本。若要在一次運行中遷移多個版本,請使用 --target-sdk 旗標:

1
dart migrate --apply --target-sdk=3.14.0

深入了解: Dart migrate 文件

Analysis Server 效能改進

除了更流暢的 SDK 升級之外,隨著您的工作空間不斷增長,保持 IDE 的響應速度並加速 AI 編碼代理的工作流程也是我們工具團隊的首要任務。Dart Analysis Server 已有多項效能改進:

  • 更快的檔案發現: 加快了 查找參考 等請求,尤其是在工作空間包含許多 Analysis Contexts 時。
  • 較少阻塞的任務: 以前會阻塞其他操作(例如程式碼格式化)的任務現在阻塞較少。
  • 更快的伺服器啟動: 減少啟動時間,包括分析伺服器因套件配置和分析選項的變更而重新啟動其分析時。
  • 更快的 documentColor 請求: 加快了 documentColor 請求,這在編輯檔案時解除了許多其他分析伺服器請求的阻塞。
  • 範圍分析器 Plugin 根: 將 Plugin 分析根限制為 Plugin 上下文根,這使得分析器 Plugin 分析速度更快。

Pub 更新

ETag 快取支援以加快依賴解析

在 dart pub 中,熱快取依賴解析現在更快,並且在中型到大型專案上使用的頻寬更少。當使用 dart pub get、upgrade 或 add 解析依賴時,pub 會查詢 pub.dev 以獲取每個套件的版本列表,以檢查新發布的版本、撤回和安全建議,這以前意味著即使沒有任何變化也需要重新下載數 MB 的套件中繼資料。

現在,dart pub 將伺服器的 ETag 與快取的套件列表一起儲存在您的本地 pub 快取中,並在透過熱快取解析時發送條件式 If-None-Match 請求。當套件列表未更改時,pub.dev 會回應 304 Not Modified 和空主體,並且 pub 會直接重用快取的列表而無需重新下載。在一個包含 144 個依賴項的 Flutter 專案中,這消除了約 1.5 MB 的重複版本列表下載,加快了熱快取解析速度,尤其是在速度較慢或延遲較高的連接上。

重新設計的 DartPad beta

我們很高興能分享重新設計的 DartPad 的 beta 版本,它讓您在瀏覽器中更容易、更快速地試驗 Dart 和 Flutter。

它建立在 package:dartpad 之上,該套件將 Dart 編譯器、分析器和 pub 用戶端編譯為 WebAssembly 並在 Web Worker 中本地執行。這意味著 DartPad 現在直接在瀏覽器中分析和編譯您的程式碼,因此您無需等待遠端伺服器即可獲得更快的意見回饋。它還具有完整的語言伺服器協定 (LSP) 支援:您可以獲得與 IDE 中相同的程式碼完成、懸停文件、跳轉到定義和快速修復。

這個新技術堆疊的一個令人興奮的功能是它允許您從 pub.dev 引入套件,因此您不再受限於手動挑選的允許列表。引入您在真實專案中會使用的函式庫並立即嘗試它們。此外,DartPad 現在支援多個檔案,因此您可以像在真實應用程式中一樣組織 Widget 和資料模型。

新的 DartPad 展示了 Dart 作為一種全棧語言的多功能性,它可以在您的機器、伺服器或網頁瀏覽器中運行。因為這些核心工具本身就是用 Dart 撰寫的,將它們編譯成 WebAssembly 使得可以直接在瀏覽器中執行整個工作流程。

試試看: dartpad.dev

Web 平台更新

瀏覽器和 Wasm 運行時的標準化 WebAssembly 例外

Dart WebAssembly 應用程式現在可以開箱即用地在更多瀏覽器和非瀏覽器 Wasm 環境中執行。在瀏覽器中,dart2wasm 現在預設發出最終化的 WebAssembly try_table 例外處理指令,並解決了 Safari 26.5 及更早版本中的串流編譯問題,從而在 Chrome 137+、Safari 26.2+ 和 Firefox 147+ 中啟用 WebAssembly。

在瀏覽器之外,採用 try_table 消除了編譯器對 dart compile wasm --standalone 中 JavaScript 例外包裝器的最後依賴(由社群成員 Simon Binder 貢獻)。這會產生標準的 .wasm 二進位檔,可以直接在 Wasm 運行時(例如 Wasmtime)中執行,而無需 JavaScript 主機,這使得在邊緣工作者、插件系統和伺服器端 Wasm 環境中執行 Dart 變得更加容易。若要嘗試 WASI 和 WebAssembly 元件模型,請在 GitHub 上探索 Simon Binder 的社群 wasm_tools 套件。

深入了解: WebAssembly 文件

硬體 128 位元 WebAssembly SIMD

除了更廣泛的運行時支援之外,WebAssembly 的效能在此版本中也獲得了顯著提升。歸功於社群成員 Modestas Valauskas 的 60 多項 SDK 貢獻,dart2wasm 現在將 Int32x4、Float32x4、Float64x2 及其類型化資料列表視圖直接編譯為 硬體 128 位元 WebAssembly SIMD (v128) 指令,以及在原生平台上的 dart:typed_data 中擴展和優化的 Int32x4 操作,在原生和 WebAssembly SIMD 基準測試中提供了高達 4 倍的速度提升。

深入了解: dart:typed_data 函式庫文件

移除舊版 Web 函式庫,使用 --no-deprecated-js-interop

隨著 WebAssembly 採用率的增長以及我們持續將 Dart Web 平台現代化,舊版 Web 和 JavaScript 互操作函式庫(dart:html、dart:js、dart:js_util、package:js 和相關的 dart:* 瀏覽器函式庫)已棄用,並預計在即將發布的版本中從 Dart SDK 中移除。雖然我們知道遷移需要時間,但遷移到 package:web 和 dart:js_interop 為 Dart 在 Web 上解鎖了更健壯、標準化的未來,包括與 WebAssembly 的完全相容性。

為幫助您提早準備程式碼,dart compile js (dart2js) 和 ddc 現在支援 --no-deprecated-js-interop,這會在編譯時拒絕直接或間接匯入這些函式庫,並將其 dart.library.* 環境條件在條件匯入中設定為 false。

今天在您的套件和應用程式上執行 dart compile js --no-deprecated-js-interop (或在 Flutter 3.50 中執行 flutter build web --no-deprecated-js-interop),並將剩餘的使用方式遷移到 dart:js_interop 和 package:web。

深入了解: JS interop 文件 和 遷移到 package:web

核心引擎和執行時更新

dart:typed_data 中的快速範圍比較

在效能關鍵程式碼中比較位元組緩衝區的切片不再需要分配 sublistView 並逐元素迭代(例如,使用 package:collection 的 ListEquality)。dart:typed_data 現在在所有整數類型資料列表(Uint8List、Int8List、Uint8ClampedList、Uint16List、Int16List、Uint32List、Int32List、Uint64List、Int64List)和 ByteData 上包含一個 rangeEquals 擴展方法:

1
2
3
4
5
6
7
8
9
10
11
import 'dart:typed_data';

void main() {
final packet = Uint8List.fromList([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A]);
final pngMagic = Uint8List.fromList([0x89, 0x50, 0x4E, 0x47]);

// 將 packet[0..4] 與 pngMagic[0..4] 進行比較,無需分配視圖:
if (packet.rangeEquals(0, 4, pngMagic)) {
print('PNG header matched');
}
}

在底層,rangeEquals 在 Dart VM 上會轉換為 memcmp,在 dart2wasm 上會直接載入 Wasm 陣列(ByteData 會進行 32 位元區塊處理),在 JS 上會進行緊湊的類型化陣列循環,為您提供所有目標上的快速、無記憶體分配的比較。

深入了解: dart:typed_data 函式庫文件

直接原生互操作性

除了核心運行時之外,從 Dart 呼叫原生平台函式庫現在已可投入生產。透過 Dart 3.14,用於 Objective-C 的 FFIgen 和 JNIgen 都穩定了!

您可以使用 FFIgen 和 JNIgen 自動產生慣用、類型安全的 Dart 綁定,並直接從 Dart 呼叫 Objective-C、Java 和 Kotlin API,而不是撰寫手動平台通道樣板程式碼。達到穩定性是多年設計、迭代和回饋的結果,重點在於減少建構 Dart 套件和 Flutter 插件的摩擦,我們將很快在 Flutter 部落格 上深入探討如何為您的用例選擇正確的互操作方法。

深入了解: 原生互操作性文件

展望未來:語言發展藍圖

團隊在 this 升級和靜態擴展方面持續取得進展。請繼續關注,在即將發布的版本中了解更多資訊!

深入了解: Dart 語言漏斗

社群

Dart 的結構化 RFC 流程

社群貢獻者在每個 Dart 版本中都扮演著重要角色,包括 Dart 3.14 中獨立的 WebAssembly 和硬體 SIMD 改進。隨著 Dart 生態系統持續發展,我們希望讓追蹤和貢獻重大專案決策變得更加容易。Dart 專案正在採用一種新的結構化方法來提案和評估需要團隊共識的重大變更:此類變更現在需要撰寫一份「請求評論 (RFC)」。

此流程可供團隊成員和社群貢獻者用於徵求 Dart 團隊和 Dart 專案領導的意見回饋和正式批准。它還旨在透過將設計討論和決策成果整合到一個地方來清晰地展示團隊正在處理的內容。

深入了解: Dart RFC 儲存庫

體驗 Dart 3.14

我們的 pi 版本讓 Dart 臻於完美,將您的工作流程從在瀏覽器中使用 DartPad 測試 pub.dev 套件,到發布高效能的 WebAssembly 和原生應用程式,再到使用 dart migrate 自動化版本升級。在底層,Dart 自己的編譯器、分析器和 pub 用戶端現在會編譯成 WebAssembly,以便在瀏覽器中執行 Dart 本身。

這個完美的循環也延伸到 Dart 社群。Dart 3.14 中的主要亮點直接由開源貢獻者推動,我們新的 RFC 流程為大型工程變更的設計、審查和在整個 Dart 專案中的共享帶來了更高的透明度。感謝所有在此版本中貢獻程式碼、提交問題和分享回饋的人!

準備好深入探索了嗎?運行 flutter upgrade 或 下載最新的 Dart SDK,試用新的 DartPad beta 預覽版,並在我們的 GitHub 問題追蹤器 上分享您的回饋。感謝您與我們一同建構!

深入了解: Dart SDK 變更日誌

更多來自 Dart 的內容

Announcing Dart 3.13

宣布 Dart 3.13

為 Dart 程式碼庫、工具和平台帶來簡潔和簡單。

Connie Ooi Connie Ooi
2026 年 8 月 12 日 · 9 分鐘閱讀
Announcing Dart 3.12

宣布 Dart 3.12

在 Google I/O 2026 上為開發人員生產力注入超能力

Connie Ooi Connie Ooi
2026 年 5 月 20 日 · 7 分鐘閱讀