关于Beta版测试空安全Dart的公告。开始将程序包迁移到安全状态的过程





当然,空安全是语言开发中的重要一步。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安全模式下运行。下面的例子显示该应用程序将准备进行迁移,如果它更新其依赖关系pathprocesspedantic于中列出的预发布版本可分解







如果较新的次要版本中提供了空安全支持,则您将在“可升级”列中看到它们。零安全支持通常将在主要的新版本中提供;在这种情况下,您将在过时的实用程序的输出中看到“可解析”部分列出的版本。要切换到它们,请编辑文件pubspec.yaml以允许使用这些主要版本。例如,您可以更改

process: ^3.0.13process: ^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.x3.0.0)。这样可以确保您的包用户在准备使用null安全之前不会升级到它。这使您可以自由地重构API,以充分利用null安全性。
  • 翻译和发布您的软件包,作为pub.dev预览(例如,使用3.0.0-nullsafety.0而不是3.0.0。)


有关迁移和版本控制的更多信息,请参阅迁移指南



保证零安全的好处



我们之前在DartFlutter上有关零安全技术预览的文章使用许多示例讨论了这些更改的好处。既然零安全已接近尾声,我们将在现实世界中看到这种好处的几个例子。



更安全的代码



我们最近在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团队和社区讨论最新的语言更新。



All Articles