跳到主要内容

重大更改和弃用

此页面列出了 Dart SDK 中的所有重大更改和弃用,按版本和区域组织,以帮助 Dart 用户理解和管理其影响。完整的发行说明可在Dart SDK 变更日志中找到。重大更改策略文档描述了 Dart 中关于重大更改和弃用的策略和流程。

此页面包含以下类型的重大更改:

  • 未版本化:Dart SDK 不维护向后兼容性,如果您升级您的 sdk 版本,并且代码依赖于之前的行为,则代码可能会立即中断。

    这些是大多数更改,并且在此列表中没有特别标记。

  • 语言版本化:Dart SDK 为现有代码维护向后兼容性,并且行为更改仅在您升级代码的语言版本时生效(可能会破坏依赖于先前行为的代码)。

    这些标记为: 语言版本化

  • 弃用:Dart SDK 为弃用的代码维护兼容性,并发出警告。弃用将在后续版本中完全删除,从而破坏任何依赖于先前行为的代码。

    这些标记为: 已弃用 / 已移除

  • 实验性:作为版本的一部分发布,但在 SDK 中尚未被视为稳定,并且可能会在一个版本到另一个版本之间中断。实验性更改不一定总是有相应的重大更改问题,但可能在SDK 变更日志中有更多详细信息。

    这些标记为: 实验性

如果您对任何这些重大更改有疑问或疑虑,请在相关条目的重大更改问题上发表评论。要接收未来重大更改的通知,请加入 Dart 公告组。

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)

#

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

#
  • 实验性 JS 类型(如 JSAny)具有新的编译器特定表示类型
  • 实验性 用户定义的 @staticInterop不能再实现 JSAnyJSObject。用法应迁移到 JSObject.fromInteropObject 或定义为扩展类型。
  • 实验性 JSArrayJSPromise 现在具有泛型参数。
  • 实验性 各种扩展成员已移动或重命名。要了解有关更新后的扩展,请参考 JSAnyUtilityExtensionJSAnyOperatorExtension

dart:typed_data

#

dart:nativewrappers

#

工具

#

生产 JavaScript 编译器 (dart2js)

#

Wasm 编译器 (dart2wasm)

#

分析器

#
  • 实验性 分析器现在会报告无效的 dart doc 注释指令。

  • 由于 类型提升方面的改进,以下分析器诊断可能会在以前通过分析的现有代码上触发

    • unnecessary_non_null_assertion
    • unnecessary_cast
    • invalid_null_aware_operator

Linter

#
  • iterable_contains_unrelated_typelist_remove_unrelated_type lint 已被移除。请考虑迁移到扩展的 collection_methods_unrelated_type lint。

  • 以下 lint 由于在健全的空安全中不再必要而被移除。您应该从 analysis_options.yaml 文件和任何 ignore 注释中删除它们的配置。

    • 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

#

语言

#

#
  • 以下现有类已被制作为混入类:IterableIterableMixinIterableBaseListMixinSetMixinMapMixinLinkedListEntryStringConversionSink

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 Dev Compiler (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 Dev Compiler (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

#
  • const map 中的重复键是不允许的,并会产生编译时错误。

2.0.0

#

语言

#

#
  • 将核心库中的常量从 SCREAMING_CAPS 重命名为 lowerCamelCase
  • 向核心库类添加了许多新方法,如果您实现这些类的接口,则需要实现这些方法。
  • 当使用 Dart for Web 时,不再支持 dart:isolatedart:mirrors

工具

#

Pub

#