跳到主要內容

重大變更與棄用

此頁面列出了 Dart SDK 更新中的所有重大變更和棄用,按釋出版本和領域組織,以幫助 Dart 開發者瞭解和管理其影響。完整的釋出說明可在Dart SDK 變更日誌中檢視。重大變更政策文件描述了 Dart 中重大變更和棄用的政策和流程。

此頁面包含以下型別的重大變更:

無版本限制

Dart SDK 不維護向後相容性,如果您的程式碼依賴於舊行為,則一旦升級 SDK 版本,程式碼可能會立即中斷。

這些是大多數變更,在此列表中沒有特殊標記。

語言版本限定

Dart SDK 維護現有程式碼的向後相容性,行為變更僅在您升級程式碼的語言版本時生效(可能破壞依賴舊行為的程式碼)。

這些標記為: 語言版本限定

棄用

Dart SDK 維護已棄用程式碼的相容性,併發出警告。棄用項隨後會在後續版本中完全移除,從而破壞依賴舊行為的任何程式碼。

這些標記為: 已棄用 / 已移除

實驗性

作為釋出版本的一部分,但尚未在 SDK 中被視為穩定,並且可能在一個版本到另一個版本之間發生中斷。實驗性變更不一定總有相應的重大變更問題,但可能在SDK 變更日誌中有更多詳細資訊。

這些標記為: 實驗性

如果您對這些重大變更中的任何一個有疑問或疑慮,請在相關條目連結的重大變更問題上發表評論。要接收未來重大變更的通知,請加入 Dart announce 小組。

3.9.0

#

語言

#
  • 語言版本限定 在計算型別提升、可達性和確定性賦值時,現在預設啟用空安全。因此,改進的死程式碼分析可能會導致對以前透過分析的現有程式碼觸發新的分析器診斷。

3.8.0

#

#

dart:html

#

工具

#

分析器

#

開發 JavaScript 編譯器 (DDC)

#
  • 現在,當一個重定向工廠建構函式被“拆分”並且其可選的非空引數之一未提供值時,會丟擲執行時錯誤。未來這很可能會成為編譯時錯誤。

生產 JavaScript 編譯器 (dart2js)

#
  • 實驗性 已移除 --experiment-new-rti--use-old-rti 標誌不再受支援。

格式化工具 (dart format)

#
  • 語言版本限定 格式化工具進行了一些更改和修復,使得當程式碼的語言版本為 3.8 或更高時,會產生新的格式化輸出。

3.7.0

#

語言

#

#

dart:html, dart:indexed:db, dart:svg, dart:web_audo, dart:web_gl, dart:js

#
  • 已棄用 這些舊版 Web 庫已正式棄用。預計它們將在未來版本中移除。專案應遷移到使用 package:webdart:js_interop。瞭解更多資訊,請檢視遷移到 package:web

dart:js, dart:js_util, package:js

#
  • 已棄用 這些舊版 JS 互操作庫已正式棄用。預計它們將在未來版本中移除。專案應遷移到使用 dart:js_interop。瞭解更多資訊,請檢視JS 互操作用法

工具

#

分析器

#

格式化工具 (dart format)

#
  • 語言版本限定 格式化工具實現了一種新樣式,當使用 3.7 或更高語言版本格式化程式碼時,會產生新的輸出。
  • 已移除 dart format--fix 標誌不再受支援。要應用類似的修復及更多功能,請配置您的分析選項並執行 dart fix
  • 已棄用 dart format--line-length 選項已棄用並設定為移除。所有用法都應遷移到新的 --page-width 選項。

3.6.0

#

語言

#

#

dart:io

#

工具

#

分析器

#

編譯器前端 (cfe)

#
  • Dart 編譯器現在會在型別模式傳入子型別測試過程之前計算其上閉包和下閉包。在 Dart 3.6 之前,編譯器在上下限計算的最開始就計算它們。分析器已經遵循此行為,因此已經透過分析的應用程式不太可能受到此更改的影響。

Wasm 編譯器 (dart2wasm)

#
  • 當編譯為 WebAssembly 時,條件匯入上的 dart.library.js 條件現在為 false。應改用 dart.library.js_interop 條件。

格式化工具 (dart format)

#

當使用 Dart 3.6 SDK 或更高版本執行 dart format 時,以下更改可能會導致細微的格式化變更:

  • 保留舊式函式型別形式引數的型別引數,這些形式引數也使用 this.super.
  • 正確格式化同時包含 asif 子句的匯入。

Pub

#
  • 如果 git 中跟蹤的檔案有未提交的更改,dart pub publish 現在會發出警告。

3.5.0

#

語言

#

#

dart:core

#

dart:io

#

dart:js_interop

#

dart:typed_data

#

執行時

#
  • 已移除 Dart VM 不再支援不健全的空安全。
    • --no-sound-null-safety CLI 選項已移除。
    • Dart_NewListOfDart_IsLegacyType 函式已從 C API 中移除。
  • 已移除 Dart_DefaultCanonicalizeUrl 函式已從 C API 中移除。

3.4.0

#

語言

#

#

dart:cli

#

dart:html, dart:indexed:db, dart:svg, dart:web_audo, dart:web_gl

#
  • 已棄用 這些庫現在被標記為舊版,未來將獲得較少支援。新專案應優先使用 package:webdart:js_interop。瞭解更多資訊,請檢視遷移到 package:web

dart:js

#
  • 已棄用 此庫現在被標記為舊版,未來將獲得較少支援。用法應遷移到 dart:js_interopdart:js_interop_unsafe。瞭解更多資訊,請檢視/go/next-gen-js-interop

dart:js_util

#
  • 已棄用 此庫現在被標記為舊版,未來將獲得較少支援。用法應遷移到 dart:js_interopdart:js_interop_unsafe。瞭解更多資訊,請檢視/go/next-gen-js-interop

dart:io

#

dart:typed_data

#

工具

#

生產 JavaScript 編譯器 (dart2js)

#
  • 實驗性 已棄用 您現在應該為 --dump-info CLI 選項指定 binaryjson 格式。json 格式已棄用,並可能在未來的 Dart 版本中移除。

Wasm 編譯器 (dart2wasm)

#
  • 實驗性 各種 dart compile wasm CLI 引數已更新、移除或替換。瞭解更多資訊,請執行 dart compile wasm --verbose --help

執行時

#
  • 已移除 Dart VM 不再支援外部字串。因此,Dart_IsExternalStringDart_NewExternalLatin1StringDart_NewExternalUTF16String 函式已從 Dart C API 中移除。

3.3.0

#

SDK

#
  • 實驗性 已移除 以下實驗性功能現已停用,因為它們已在 Dart 3 中釋出,並且在語言版本為 3.0 或更高時不再需要。應從分析選項、CLI 命令和 IDE 配置中移除它們的配置。

    • 模式
    • 記錄
    • 類修飾符
    • 密封類

語言

#

#

dart:cli

#
  • 實驗性 已棄用 waitFor 函式在下一個版本中仍將棄用,並計劃在 Dart 3.4 中移除。

dart:ffi

#

dart:html

#
  • 現在建議使用 package:http,而不是直接使用 HttpRequest

dart:io

#
  • 現在建議使用 package:http,而不是直接使用 HttpClient

dart:js_interop

#
  • 實驗性JSAny 這樣的 JS 型別有新的編譯器特定表示型別
  • 實驗性 使用者定義的 @staticInterop不再能實現 JSAnyJSObject。用法應遷移到 JSObject.fromInteropObject 或定義為擴充套件型別。
  • 實驗性 JSArrayJSPromise 現在具有泛型引數。
  • 實驗性 各種擴充套件成員已被移動或重新命名。要了解更新後的擴充套件,請參考 JSAnyUtilityExtensionJSAnyOperatorExtension

dart:typed_data

#

dart:nativewrappers

#

工具

#

生產 JavaScript 編譯器 (dart2js)

#

Wasm 編譯器 (dart2wasm)

#

分析器

#
  • 實驗性 無效的 dart doc 註釋指令現在由分析器報告。

  • 由於型別提升的改進,以下分析器診斷可能會對以前透過分析的現有程式碼觸發:

    • 不必要的非空斷言
    • 不必要的型別轉換
    • 無效的空感知運算子

Linter

#
  • iterable_contains_unrelated_typelist_remove_unrelated_type lint 已移除。考慮遷移到擴充套件的 collection_methods_unrelated_type lint。

  • 由於健全的空安全不再需要,以下 lint 已移除。您應該從 analysis_options.yaml 檔案和任何忽略註釋中移除它們的配置。

    • always_require_non_null_named_parameters
    • avoid_returning_null
    • avoid_returning_null_for_future

3.2.0

#

語言

#

#

dart:cli

#

dart:convert

#

dart:developer

#
  • 已棄用 Service.getIsolateID 方法。

dart:ffi

#

dart:io

#

dart:js_interop

#
  • 實驗性 已移除 JSNumber.toDart 已移除,請改用 toDartDoubletoDartInt
  • 實驗性 已移除 Object.toJS 已移除,請改用 Object.toJSBox.
  • 實驗性 使用 dart:js_interop 的外部 JS 互操作 API 已限制為一組允許的型別。
  • 實驗性 禁止在 dart2wasm 上使用 isNullisUndefined
  • 實驗性 typeofEqualsinstanceof API 已更改為均返回 bool 而不是 JSBoolean。此外,typeofEquals 現在接受 String 而不是 JSString
  • 實驗性 JSAnyJSObject 型別已更改為只能由使用者 @staticInterop 型別實現,不能擴充套件。
  • 實驗性 JSArray.withLength 已更改為接受 int 而不是 JSNumber

工具

#

開發 JavaScript 編譯器 (DDC)

#

生產 JavaScript 編譯器 (dart2js)

#

分析器

#

3.1.0

#

#

dart:async

#

dart:io

#

dart:js_interop

#
  • 實驗性 已移除 ObjectLiteral;請使用 {}.jsify() 建立不帶命名成員的物件字面量。

package:js

#
  • external @staticInterop 成員和 external 擴充套件成員不再能用作 tear-offs。請宣告一個呼叫這些成員的閉包或非 external 方法,並改用它。
  • external @staticInterop 成員和 external 擴充套件成員對於具有可選引數的方法將生成略有不同的 JS 程式碼。

3.0.0

#

語言

#

#
  • 以下現有類已成為 mixin 類:Iterable, IterableMixin, IterableBase, ListMixin, SetMixin, MapMixin, LinkedListEntry, StringConversionSink

dart:core

#

dart:async

#

dart:collection

#

dart:developer

#

dart:ffi

#
  • 實驗性 已棄用 @FfiNative 註解現在已棄用。用法應更新為使用 @Native 註解。

dart:html

#

dart:math

#
  • 語言版本限定 Random 介面只能被實現,不能被擴充套件。

dart:io

#

2.19.0

#

語言

#

#

dart:convert

#

dart:developer

#

dart:ffi

#

dart:io

#

dart:isolate

#
  • SendPort.send 恢復為在不確定共享相同程式碼的隔離區之間傳送訊息時,對訊息內容進行嚴格檢查。

dart:mirrors

#

package:js

#

dart2js

#

2.18.0

#

語言

#

#

dart:io

#

工具

#

Dart 命令列

#

2.17.0

#

#

dart:io

#

工具

#

Dart 命令列

#

2.16.0

#

#

dart:io

#

dart:isolate

#

工具

#

Dart 命令列

#

2.15.0

#

#

dart:io

#

dart:web_sql

#

dart:html

#

工具

#

Dart 命令列

#

Dart VM

#

2.14.0

#

#

dart:io

#
  • HttpClient 中的 setter 回撥 .authenticate.authenticateProxy 現在必須接受可空的 realm 引數(對於未遷移的空安全程式碼)。

dart:typed_data

#

工具

#

Dart VM

#

Dart 命令列

#

dart2js

#

Dart 開發編譯器 (DDC)

#

2.13.0

#

#

package:js

#
  • 對於非匿名 JS 互操作類,在 @JS() 註解中使用與 @Native 註解匹配的 String 不再有效

2.12.0

#

語言

#

#

dart:ffi

#

工具

#

Dart VM

#

Pub

#

2.10.0

#

工具

#

Dart VM

#

2.9.0

#

#

dart:convert

#

dart:html

#
  • 如果 CssClassSet 對應於多個元素,CssClassSet.add()CssClassSet.toggle 現在返回 false 而不是 null

dart:mirrors

#

工具

#

Dart VM

#

2.8.1

#

語言

#

#

dart:async

#

dart:core

#

dart:ffi

#
  • Pointer.asFunction()DynamicLibrary.lookupFunction() 更改為擴充套件方法。

dart:io

#

工具

#

Dart 開發編譯器 (DDC)

#

我們修復了 DDC 和 Dart2JS 之間的多處不一致,以便使用者更少遇到一個編譯器接受但另一個編譯器失敗的程式碼。

  • 刪除了DDC的舊版(基於分析器)版本。
  • 現在,使用推薦的 package:js 互操作規範傳遞給 JavaScript 的函式必須用 allowInterop 呼叫包裹起來。
  • @JS() 類中的建構函式必須用 external 標記。

dart2js

#
  • 相應的型別引數邊界現在只需是相互子型別,而不是在繫結型別變數重新命名和所有頂層型別相等的情況下結構上相等。
  • 型別現在已標準化
  • @JS() 類中的建構函式必須用 external 標記。
  • 完全移除了 --package-root 標誌,該標誌在 Dart 2.0.0 中已隱藏和停用。

2.7.1

#

2.7.0

#

語言

#

#

dart:io

#
  • 添加了 IOOverrides.serverSocketBind,以幫助編寫希望模擬 ServerSocket.bind 的測試。

2.6.0

#

語言

#

#

dart:ffi

#
  • API 現在使用靜態擴充套件成員。
  • 移除了記憶體管理 Pointer.allocatePointer.free
  • Pointer.offsetBy 已移除,請改用 castelementAt

2.5.0

#

#

dart:io

#

工具

#

Pub

#

2.4.0

#

語言

#

#

dart:isolate

#
  • 當使用 dart2js 或 DDC 編譯時,Isolate.resolvePackageUri 將始終丟擲 UnsupportedError

dart:async

#

2.2.0

#

#

package:kernel

#
  • Kernel AST API 中 InstanceConstant 類上的 klass getter 已重新命名為 classNode 以保持一致性。
  • 更新了 Link 實現,以便在 Windows 上使用真正的符號連結而不是連線點。

2.1.1

#

#

dart:io

#

工具

#

Dart VM

#

2.1.0

#

語言

#

工具

#

dart2js

#
  • 常量對映中不允許重複鍵,並且會產生編譯時錯誤。

2.0.0

#

語言

#

#
  • 將核心庫中的常量從 SCREAMING_CAPS 重新命名為 lowerCamelCase
  • 為核心庫類添加了許多新方法,如果您實現這些類的介面,則需要實現這些方法。
  • 在 Web 上使用 Dart 時,不再支援 dart:isolatedart:mirrors

工具

#

Pub

#