目录

重大更改和弃用

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

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

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

    这些是大多数更改,在此列表中未特别标记。

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

    这些标记为: 语言版本化

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

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

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

    这些标记为:实验性

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

3.7.0

#

暂定
以下更改预计将包含在 3.7 稳定版本中,但最终列表可能会在此之前更改。为了减少这些更改的潜在影响,请考虑在 3.7 版本之前解决这些问题。

语言

#

工具

#

分析器

#

格式化程序 (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 命令行选项已被移除。
    • 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 命令行选项指定 binaryjson 格式。json 格式已弃用,可能会在未来的 Dart 版本中删除。

Wasm 编译器 (dart2wasm)

#
  • 实验性 各种 dart compile wasm 命令行参数已更新、删除或替换。要了解更多信息,请运行 dart compile wasm --verbose --help

运行时

#
  • 已移除 Dart VM 不再支持外部字符串。因此,Dart_IsExternalStringDart_NewExternalLatin1StringDart_NewExternalUTF16String 函数已从 Dart C API 中移除。

3.3.0

#

SDK

#
  • 实验性 已移除 以下实验现已停用,因为它们已在 Dart 3 中发布,并且在语言版本为 3.0 或更高版本时不再需要。应从分析选项、命令行和 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 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

#
  • 实验性 已移除 使用 toDartDoubletoDartInt 代替 JSNumber.toDart
  • 实验性 已移除 使用 Object.toJSBox 代替 Object.toJS
  • 实验性 使用 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 类: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 现在必须接受可为 null 的 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

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

2.0.0

#

语言

#

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

工具

#

Pub

#