当然,空安全是语言开发中的重要一步。Dart团队宣布了null安全版本的Beta版!我们已将有关此发行版的新闻翻译成俄语,您将在其中学习如何迁移到新版本,将获得什么好处以及零安全对我们所有人有什么好处。
今天,我们宣布Dart和Flutter提供了可靠的null安全Beta。空安全是我们的最新重大改进,可帮助您避免空引用错误,这是一类通常很难检测到的错误。该视频从总体上解释了我们喜悦的原因:
随着向null安全性beta的迁移,是时候迁移pub.dev上的数千个可用软件包了。我们已经移植了Dart核心库,Flutter框架以及40多个Dart和Flutter软件包。话虽如此,我们希望社区能够通过迁移其软件包来接受零安全。
对于Beta版本,我们还将进入发布零安全稳定版本之前的阶段。我们希望您能够利用此功能,并让我们知道我们是否可以改进它,并使UI消息和文档更加清晰。我们期待您的反馈。
选择零安全
在讨论迁移到null安全之前,我们要重申(如我们的null安全准则中所述),您可以准确选择何时开始迁移。如果应用程序和程序包的最低Dart SDK限制至少为Dart 2.12的预发布版本,则它们将只能使用null安全模式:
environment:
sdk: ">=2.12.0-0 <3.0.0"
要进行尝试,请尝试创建一个
dart create
包含以下代码的小型null安全性hello应用程序(例如使用)。然后,您可以在更改SDK限制和启动之前和之后尝试运行应用程序,dart pub get
并查看程序行为如何变化。(请确保dart --version
准确返回2.12给您)。
bin/hello.dart:
...
void main() {
var hello = 'Hello Dart developers';
if (someCondition) {
hello = null;
}
print(hello);
}
Before changing the SDK constraint:
$ dart run
null
After changing the SDK constraint (and running dart pub get):
$ dart run
bin/hello.dart:6:13: Error: Null can't be assigned to a variable of
type 'String' because 'String' is not nullable.
hello = null;
^
转向零安全
要将程序包(或简单的应用程序)迁移到null安全模式,请遵循dart.dev迁移指南中详细介绍的以下五个步骤。
步骤1:检查您的依赖项是否准备就绪
强烈建议您从依赖关系图的“叶”开始按顺序移动代码。例如,如果C依赖于B,而B依赖于A,则首先迁移到空安全性A,然后迁移到B,然后迁移到C。无论A,B和C是库,程序包还是应用程序,此顺序均适用。
为什么订单如此重要?您可以在迁移依赖项之前在代码迁移方面取得一些进展,但是如果您的依赖项在迁移过程中更改了它们的接口,则存在必须重新运行的风险。如果您的某些依赖关系不是null安全的,请考虑使用pub.dev上每个软件包列出的联系方式与软件包发行商联系。
检查依赖项是否准备就绪
要检查您的应用程序或程序包是否已准备好开始迁移,可以
dart pub outdated
在null安全模式下运行。下面的例子显示该应用程序将准备进行迁移,如果它更新其依赖关系path
,process
并pedantic
于中列出的预发布版本可分解列。
如果较新的次要版本中提供了空安全支持,则您将在“可升级”列中看到它们。零安全支持通常将在主要的新版本中提供;在这种情况下,您将在过时的实用程序的输出中看到“可解析”部分中列出的版本。要切换到它们,请编辑文件
pubspec.yaml
以允许使用这些主要版本。例如,您可以更改
process: ^3.0.13
为process: ^4.0.0-nullsafety
。
您还可以使用包页面中的新Null安全标签(例如集合1.15)和新的Advanced null安全搜索选项, 在pub.dev上找到具有null安全支持的软件包。
步骤2:使用迁移工具进行传输
依赖关系就绪后,您就可以使用迁移工具开始迁移您的应用程序或软件包
dart migrate
。
迁移工具是交互式的,因此您可以查看此工具推断的null安全属性。如果您不同意该工具的任何结果,则可以添加空提示以对其进行更改。仅添加一些提示可能会对迁移质量产生巨大影响。
数位Dart软件包作者已使用早期的预构建null安全构建测试了迁移,他们的反馈令人鼓舞。迁移指南提供了使用迁移工具的其他提示。
步骤3:对移植代码的静态分析
在您的IDE或命令行中使用pub更新软件包。然后使用IDE或命令行对Dart代码执行静态分析:
$ dart pub get
$ dart analyze
或在Flutter代码中:
$ flutter pub get
$ flutter analyze
步骤4:确保测试通过
运行测试并确保它们安全通过。如果将软件包代码更改为不允许使用空值,则可能需要更新预期为空的测试。
步骤5:发布您的null安全软件包
完成迁移并运行测试后,您可以将软件包发布为预发行版。以下是最佳做法的摘要:
- 将版本升级到下一个主要版本(例如,从
2.3.x
到3.0.0
)。这样可以确保您的包用户在准备使用null安全之前不会升级到它。这使您可以自由地重构API,以充分利用null安全性。 - 翻译和发布您的软件包,作为pub.dev的预览。(例如,使用
3.0.0-nullsafety.0
而不是3.0.0
。)
有关迁移和版本控制的更多信息,请参阅迁移指南。
保证零安全的好处
我们之前在Dart和Flutter上有关零安全技术预览的文章使用许多示例讨论了这些更改的好处。既然零安全已接近尾声,我们将在现实世界中看到这种好处的几个例子。
更安全的代码
我们最近在Flutter主分支上发现了一个错误,该错误导致
flutter
某些工具配置在使用null:error的某些计算机配置上崩溃The method '>=' was called on null
。主要问题是最近请求添加对Android Studio 4.1检测的支持的请求。该拉取请求添加了如下代码:
final int major = version?.major;
final int minor = version?.minor;
if (globals.platform.isMacOS) {
/// plugin path of Android Studio changed after version 4.1.
if (major >= 4 && minor >= 1) {
...
你能找到一个bug吗?由于版本可以为空,因此主要和次要版本也都可以为空。在这里孤立地发现此错误似乎很容易,但是实际上,即使使用Flutter存储库中严格的代码检查过程,这种代码也始终存在。使用null安全性,静态分析会立即发现此问题:
这是一个非常简单的错误。在Google内部代码中使用null-safety的早期,我们看到了检测到并通过null-safety解决的更复杂的错误。这里有些例子:
- , null , null-safety null. , protobuf, , , null. , , - null .
- Google Pay Flutter, - Flutter
State
Widget
. null-safety null ; null-safety , null, . - Flutter , - Flutter , null
scene
Window.render()
. null-safety , Scene , , null.
null-safety
Dart的null安全性也很重要:Dart编译器可以利用null安全性信息。它可以使您的程序更小,更快。到目前为止,我们还没有很多真正的应用程序可以完全转换为零安全性(毕竟,我们刚刚开始迁移这些应用程序依赖于可靠性的软件包生态系统),但是我们看到主框架带来了令人鼓舞的结果。
最近,我们对hello_world示例进行了测试重新编译,以测量null安全性对应用程序大小的影响。这是一个仅显示“ hello world”的最小示例。当比较编译后的代码的总大小,未压缩(安装在设备上)的代码的大小减少了3.5%,除了具有可靠的null安全性的重新编译外,无需执行任何其他操作。尽管事实上整个应用程序由10行代码组成,但这仍然是可能的,因为减小了所有包含库的代码大小。例如,Flutter(
package:flutter
)框架本身缩小了3.9%。
在代码速度方面,强制执行受信任的数据类型系统的需求可能会增加开销。但是,较少的null检查也可能会加快代码的速度。对基准的初步分析表明,性能与以前的版本相当,并且新的附加类型信息使我们有潜力在将来提高性能。我们计划在以后的出版物中写更多有关此的内容。
在某些情况下,我们已经看到,当过渡揭示出代码逻辑中的缺陷时,空安全如何导致性能提升。例如,我们在Flutter网站的文本定位缓存中发现了一个问题。此缓存使用了可为空的键,然后根据给定的逻辑使用了
TextAlign.start
为null时。此逻辑引发了一个高速缓存错误,即使项目仍具有默认值,这些项目看起来也好像已更改。结果,经常有对缓存的无效调用。添加textAlign
不允许为null的getter ,有助于纠正错误缓存,在缓存文本的情况下,可将文本的渲染性能提高14倍。
立即开始!
包含null安全性的Dart和Flutter Beta版已准备就绪。如果您使用Flutter编写,则可以使用
flutter channel beta
和切换至beta flutter upgrade
。而且,如果您不使用Flutter,则可以从Dart SDK存档中获得独立的Dart SDK。
如果您正在开发软件包,建议您阅读我们的迁移指南并计划迁移。请让我们知道您有任何问题或建议。
如果您是应用程序开发人员,则可以将端口推迟,直到该功能出现在我们的稳定版本中。我们计划快速响应Beta反馈并解决所有剩余问题。很难给出将以稳定版本发布null安全性的具体日期,但是我们正在考虑明年年初。
感谢您的支持和反馈!我们正在努力使Dart成为更强大的语言,使Flutter成为更强大的框架。
Dart and Flutter产品经理Michael Thomsen在官方Dartlang博客上发布了这篇文章。如果您想听听Michael的讲话并亲自与他互动,请在12月4日和5日参加DartUP 2020 Online,并与Dart团队和社区讨论最新的语言更新。