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