目录

重大更改和弃用

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

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

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

    这些更改占大多数,在本列表中没有特殊标记。

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

    这些标记为:

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

    这些标记为: /

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

    这些标记为:

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

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

#
  • dart pub publish 现在会在 git 中跟踪的文件具有未提交的更改时发出警告。

3.5.0

#

语言

#

#

dart:core

#

dart:io

#

dart:js_interop

#

dart:typed_data

#

运行时

#
  • Dart VM 不再支持不健全的空安全。
  • 已删除 --no-sound-null-safety CLI 选项。
  • 已从 C API 中删除 Dart_NewListOfDart_IsLegacyType 函数。
  • 已从 C API 中删除 Dart_DefaultCanonicalizeUrl 函数。

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

#
  • [Stdout 有一个新的字段 lineTerminator ,它允许

允许开发人员控制 stdoutstderr 使用的行尾。](https://github.com/dart-lang/sdk/issues/53863) 实现 Stdout 的类必须定义 lineTerminator 字段。 stdoutstderr 的默认语义没有更改。

  • FileSystemDeleteEvent.isDirectory 属性。它始终返回 false

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

Lint 检查器

#
  • 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)

#

分析器

#
dart
class C {
  final num? _x = null;

  void test() {
    if (_x != null) {
      print(_x! * 2); // unnecessary_non_null_assertion
      print(_x?.abs()); // invalid_null_aware_operator
    }
    if (_x is int) {
      print((_x as int).bitLength); // unnecessary_cast
    }
  }
}

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 交互操作类的 @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

#

语言

#
  • 修复了一个实现错误 ,其中局部变量推断会错误地使用类型变量的提升类型。
  • [修复了一个实现错误](https://github.com/dart-lang/sdk/issues/41362),围绕子句 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 的旧版(基于分析器)版本。
  • 现在必须使用对 allowInterop 的调用来包装传递到 JavaScript 的函数,这些函数使用推荐的 package:js 交互操作规范。
  • @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

#

语言

#
  • 使用类型推断和运行时检查替换了不健全的可选静态类型系统,以前称为强模式
  • [标记为 async 的函数现在同步运行](https://github.com/dart-lang/sdk/issues/30345),直到第一个 await 语句。

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

工具

#

Pub

#