0%

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