你是否准备好迎接Dart3的挑战?作为Flutter开发者

发表时间: 2023-09-18 09:02

#挑战30天在头条写日记#

2023年5月10日 发布 Dart 3.0版本。

要使用Dart3的新特性,你必须将语言版本更新到3.0。这样可以同时获得Dart3版本化的更改。

environment:  sdk: '>=3.0.0 <4.0.0'

本节列出了从2023年1月26日到2023年5月10日的显著变化。

1、"Dart 2.12在两年多前引入了空值安全性。

在Dart 2.12中,用户需要通过pubspec设置来启用空值安全性。而在Dart 3中,空值安全性已经内置;开发者无法关闭它。",所以 没有支持空安全的包在解决依赖关系时会引发问题

dart pub getBecause pkg1 doesn't support null safety, version solving failed.=2.9.0 <3.0.0'" must be 2.12.0 or higher to enable null safety.

使用语言版本注释退出null安全的库选择2.12以下的任何语言版本将导致分析或编译错误:

 dart analyze .Analyzing ....                         0.6s=2.12.0.   Try removing the language version override and migrating the code.  • illegal_language_version_override
dart run bin/my_app.dart../pkg1/lib/pkg1.dart:1:1: Error: Library doesn't support null safety.// @dart=2.9^^^^^^^^^^^^

所以 在开始迁移到Dart 3之前,开发者需要确保应用程序或包已100%迁移到启用null安全。这需要Dart 2.19 SDK,而不是Dart 3 SDK。要了解如何首先迁移应用或包以支持null安全,请查看null安全迁移指南。

2、默认值的冒号语法

由于历史原因,命名可选参数可以使用:或=指定其默认值。在Dart3中,只允许使用=语法。执行 dart analyze 分析,会抛出异常:

line 2 • Using a colon as a separator before a default value is no longer supported.

比如原来的写法

int someInt({int x: 0}) => x;

dart3之后只允许

int someInt({int x = 0}) => x;

开发者可以通过 dart fix 命令来自动进行转换

dart fix --apply --code=obsolete_colon_for_default_value

3、Dart3 任何类都可以用作mixin

只要它没有声明的构造函数,并且除了Object之外没有父类。(这个作者还没去使用验证,也不知如何去具体使用)

4、Dart 3.0将 switch 用例解释为模式而不是常量表达式

test(List<int> list) {  switch (list) {    case [1, 2]: print('Matched'); break;    default: print('Did not match'); break;  }}main() {  test(const [1, 2]); // Prints "Matched".  test([1, 2]); // Prints "Did not match".}

5、Dart3.0中 continue语句针对的标签不是循环(for、do和while语句)或switch成员,Dart 3会报告编译时错误。

The label used in a 'continue' statement must be defined on either a loop or a switch member.

6、Dart Toos 也有改进

以下null安全迁移命令已被删除,因为Dart 3不支持没有null安全的代码:

dart migratedart pub upgrade --null-safetydart pub outdated --mode=null-safety

当然还移除了不少的 api ,这个在后续的文章中罗列说明 。