[Dart] Dart3.4 变更记录

269 阅读5分钟

语言层面

Dart3.4 对下面几种表达式的类型分析进行了改进。

  1. 条件表达式(e1 ? e2 : e3)
  2. 空合并表达式(e1 ?? e2)
  3. 空合并赋值(e1 ??= e2)
  4. switch 表达式(switch (e) { p1 => e1, ... })

要利用这些改进,请将包的 SDK 约束下限设置为 3.4 或更高版本(sdk: '^3.4.0')。

environment:
  sdk: '>=3.4.0 <4.0.0'
2处破坏性变更

实践中基本不会有影响。

  1. #54640

用于类型模式的模式上下文类型模式已从 Object? 更改为 _(未知类型),以与规范对齐。这一更改在实践中预计不会造成任何差异。

  1. #54828

编译器前端用于在映射和集合字面量中对空感知扩展运算符(...?)的操作数进行类型推断的类型模式已更改为可空,以匹配当前在列表字面量中发生的情况。这使得编译器前端的行为与分析器的行为一致。这一变化预计影响非常小。

Libraries

dart:cli

  1. 破坏性变更 #52121

在 3.4 中移除了 waitFor。

dart:io

  1. 破坏性变更 #53863

Stdout 新增了一个字段 lineTerminator,允许开发者控制 stdout 和 stderr 使用的行结束符。实现 Stdout 的类必须定义 lineTerminator 字段。stdout 和 stderr 的默认语义未改变。

  1. 弃用 FileSystemDeleteEvent.isDirectory,它总是返回 false。

dart:js_interop

  1. 修复了 JSAnyOperatorExtension 中几个比较运算符的问题,这些运算符声明返回 JSBoolean 但实际返回 bool。这导致在尝试使用返回值时出现运行时错误。现在的实现返回 JSBoolean 以与接口对齐。更多详情见问题#55024

  2. 添加了 ExternalDartReference 和相关的转换函数 toExternalReference 和 toDartObject。这是 JSBoxedDartObject 的一个更快速的替代品,但安全保证较少,互操作能力也较少。更多详情见#55187

工具

Analyzer

  1. 改进了代码完成。

修复了超过 50% 的完成正确性错误(completion correctness bugs),这些错误在问题跟踪器中标记为 analyzer-completion-correctness

  1. 支持 meta 包版本 1.14.0 中引入的新注解。
  • 支持 @doNotSubmit 注解,注明任何使用被注解成员的地方都不应提交到源代码控制。
  • 支持 @mustBeConst 注解,该注解表明被注解的参数只接受常量参数。

编译器

编译环境将不再假装包含所有值为""的dart.library.foo字符串条目,其中dart:foo不是一个可用的库。相反,只会有可用库的条目,如dart.library.core,其值过去是,并且现在仍然是"true"。

这对没有defaultValue参数的const bool.fromEnvironment(...)或const String.fromEnvironment(...)应该没有影响,这个参数之前总是被忽略。它改变了对此类输入使用const bool.hasEnvironment(...)时的行为,不再总是返回true因而无用。

Pub

  1. 依赖项会受到安全通告影响。

依赖项解析(Dependency resolution)和 dart pub outdated 现在将显示是否有一个依赖项受到安全通告(security advisory)的影响,除非该通告列在 pubspec.yaml 文件中的 ignored_advisories 部分下。要了解更多关于 pub 对安全通告支持的信息,请访问这里

  1. git依赖项内的路径依赖现在相对于git仓库解析。

  2. 所有dart pub命令现在可以从项目的任何子目录运行。Pub将找到第一个带有pubspec.yaml的父目录,并相对它操作。

  3. 新命令dart pub unpack,它会从pub.dev下载一个包并将其提取到当前目录的一个子文件夹中。

这对于检查代码或者试玩示例很有用。

Libraries

dart:async

  1. 添加了ParallelWaitError的选项,以获取一些元信息,它可以在其toString中暴露出来,并且Iterable<Future>.wait(Future,...,Future).wait扩展方法现在提供了该信息。应该使得ParallelWaitError更容易记录。

dart:ffi

  1. 添加了个方法Struct.createUnion.create,分别用来创建存储在TypedData子类型中的字节序列的结构体联合体视图

dart:js_interop

  1. 在dart2wasm上,JSBoxedDartObject现在是一个实际的JS对象,它包装了不透明的Dart值,而不仅仅是外部化该值。像JS后端一样,当尝试在另一个Dart运行时使用它时,你现在会得到一个更有用的错误信息。

  2. 添加了isA方法,以便于使用互操作类型进行类型检查。更多详情见#54138

dart:typed_data

  1. 破坏性变更#53218#53785 : 不推荐使用类型化数据的不可修改视图类。

不建议使用只读的类型化数据视图类。

Uint8List data = ...;
final readOnlyView = data.asUnmodifiableView();
// readOnlyView has type Uint8List, and throws if attempted modified.

此次更改的原因是为了在实现类型化数据时提供更多灵活性,以便本地和网络平台可以使用不同策略来确保类型化数据具有良好的性能。 已弃用的类型将在 Dart 3.5 中移除。

Dart运行时

  1. 现在可以通过DART_VM_OPTIONS环境变量向使用dart compile exe生成的任何可执行文件提供Dart VM标志和选项。DART_VM_OPTIONS应设置为一系列逗号分隔的标志和选项,中间不含空格。不支持允许提供多个值作为逗号分隔值的选项(例如,--timeline-streams=Dart,GC,Compiler)。

示例有效的 DART_VM_OPTIONS 环境变量:

DART_VM_OPTIONS=--random_seed=42,--verbose_gc
  1. Dart VM 不再支持外部字符串:Dart_IsExternalString、Dart_NewExternalLatin1String 和 Dart_NewExternalUTF16String 函数已从 Dart C API 中移除。

工具

DevTools

将 DevTools 从 2.31.1 更新至 2.33.0。