Dart 2 与 Dart 的早期版本有几处关键的不同。本章简单介绍这些差异,并给出迁移代码到 Dart 2 的一般建议。
关于 Dart 2 为什么改变的信息,请看 Dart 2 公告。
不同点
Dart 语言、库、编译系统、以及 web 开发工具都有改变。
语言和库
- Dart 的类型系统现在是健全的。
- Dart 不再有检查模式。
- 断言语句仍然支持,但不同的是你需要启动它。
- Dart 语言和核心库已经改变,部分原因是由于类型系统改变导致的。
Tools
- Pub 不再支持 transformers。使用新编译系统代替。
- 与 web 开发相关的工具已经改变。
- 新的编译系统代替
pub build
和pub serve
。 - Dartium 不再支持。使用 dartdevc 和 Chrome 代替。
- 新的编译系统代替
迁移代码
首先,查看平台迁移指南:
如果你发布包,还需要查看 package migration instructions below。
一般过程
这里是从 Dart 1.x 或 Dart 2 的早期版本迁移到 Dart 2 的过程概述。
-
获取 Flutter 或 Dart SDK 的最新版。
- Flutter SDK 说明
- Dart SDK 说明 (VM 或 web)
-
升级应用依赖的包。
- Flutter:
flutter packages upgrade
- Dart VM or web:
pub upgrade
- Flutter:
- 运行 dart2_fix tool。
-
运行分析器查找编译时错误。
- Flutter:
flutter analyze
- Dart VM or web:
dartanalyzer
with Dart 2 semantics
- Flutter:
- 修复代码并再次运行分析器,不断重复,直到代码通过静态分析。
-
运行测试,查找运行时错误。
- 运行软件的所有自动化测试。
- 手动测试,并查找控制台错误。考虑添加自动化测试来捕获你发现的问题。
- 修复问题直到代码正常工作。
每次 SDK 有重大发布,重复以上过程。
迁移包
作为一个包的拥有者,你需要做以下事情:
- 遵循你的包支持平台(看上面)的迁移提示。
- 确保你的包的使用者知道如何报告问题。
- 快速响应报告的问题。
- 如果代码不是向后兼容的,更新最低 SDK 约束。
变化和向后兼容
如果你必须改变你的包的代码,使其在1.x 和 Dart 2 上运行。例如,你可能会添加类型注解或(一个 API 已经移除)使用一个替代的 1.x API。
如果改变不能做到向后兼容,更新最低SDK 约束。
小心地指定 SDK 约束!错误的最低约束对于使用稳定版 SDK 的用户可能引起问题。
测试你的改变以确保你的包按预期运行。
SDK 版本的最高约束
不要更新一个已发布的包单独指出它可以用于 Dart 2 预发行版。只要一个包没有 SDK 约束或一个<2.0.0
的最高约束,pub get
以及在任意 Dart 2 预发行版中类似的 pub 命令都可以下载这个包。(这个包不会被用于 Dart 2 稳定发行版,但你可以以后修复它。)
当你更新一个已存在的包或发布一个新的包,为 SDK 版本指定一个<2.0.0
的最高约束。例如:
# Works in 1.20.1+; might work in 2.0.0-dev:
sdk: '>=1.20.1 <2.0.0'
# Backward incompatible change requires at least 2.0.0-dev.1.2:
sdk: '>=2.0.0-dev.1.2 <2.0.0'
最后,你需要发布你的包的新版本来声明 Dart 2 兼容性,大多数可能使用一个<3.0.0
SDK 约束。因为,不兼容的改变可能出现在任意 Dart 2 预发行版,不要声明 Dart 2 兼容性直到我们宣布这样做是安全的。