内容

重大变更和弃用

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

此页面包括以下类型的重大变更:

  • 未版本化:Dart SDK 不维护向后兼容性,只要你 升级 SDK 版本,代码就可能出现问题,如果代码依赖于之前的行为。

    这些是大多数变更,在本列表中未做特殊标记。

  • 语言版本化:Dart SDK 保持对现有代码的向后兼容性,行为变更只会在你升级代码的 语言版本 时生效(可能会破坏依赖于之前行为的代码)。

    这些标记为: 语言版本化

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

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

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

    这些标记为: 实验性

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

3.6.0

#

暂定
以下变更预计将包含在 3.6 稳定版本中,但最终列表可能会在发布之前发生变化。为了减少这些变更带来的潜在影响,请考虑在 3.6 版本发布之前做好准备。

语言

#

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:htmldart:indexed:dbdart:svgdart:web_audodart: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 配置中删除对它们的配置。

    • patterns
    • records
    • class-modifers
    • sealed-class

语言

#

#

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 注释指令。

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

    • unnecessary_non_null_assertion
    • unnecessary_cast
    • invalid_null_aware_operator

Linter

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

  • 以下 lints 已被移除,因为它们在健全的空安全下不再是必需的。您应该从您的 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 扩展成员不再能用作撕裂。声明一个闭包或一个非 external 方法来调用这些成员,并改用它。
  • external @staticInterop 成员和 external 扩展成员将为具有可选参数的方法生成略微不同的 JS 代码。

3.0.0

#

语言

#

#
  • 以下现有类已变为 mixin 类: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 开发编译器 (DDC)

#

2.13.0

#

#

package:js

#
  • 不再有效 在非匿名 JS 互操作类中,将与 @Native 注释匹配的 String 用在 @JS() 注释中。

2.12.0

#

语言

#
  • 空安全 现在默认情况下在所有未选择退出代码中启用。
  • 修复了实现错误,其中 this 有时会在扩展中进行类型提升。

#

dart:ffi

#

工具

#

Dart VM

#

Pub

#

2.10.0

#

工具

#

Dart VM

#

2.9.0

#

#

dart:convert

#

dart:html

#
  • CssClassSet.add()CssClassSet.toggle 现在返回 false 而不是 null,如果 CssClassSet 对应于多个元素。

dart:mirrors

#

工具

#

Dart VM

#

2.8.1

#

语言

#
  • 修复了实现错误,其中局部变量推断会错误地使用类型变量的提升类型。
  • 修复了实现错误,围绕 implements Functionextends Functionwith Function 子句不再生效,因为 Dart 2.0.0。

#

dart:async

#

dart:core

#

dart:ffi

#
  • Pointer.asFunction()DynamicLibrary.lookupFunction() 更改为扩展方法。

dart:io

#

工具

#

Dart 开发编译器 (DDC)

#

我们修复了 DDC 和 Dart2JS 之间的一些不一致,这样用户就不太可能遇到一种编译器接受但另一种编译器失败的代码。

  • 删除了 DDC 的旧版(基于分析器)版本。
  • 传递给 JavaScript 的函数,使用推荐的 package:js 互操作规范,现在必须使用 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
  • 为核心库类添加了许多新方法,如果您实现这些类的接口,则需要实现这些方法。
  • 使用 Dart 为网页开发时,不再支持 dart:isolatedart:mirrors

工具

#

Pub

#