Dart空安全Beta版本

在11月20号,官方发布了健全的空安全Beta版本。空安全作为近期最具生产力的功能,可以帮助大家避免空异常问题。

官方已经迁移Dart核心库,Flutter framework和超过40个Dart Flutter Packages支持空安全。

dart_null_safety.png

大家在使用过程中发现任何问题都可以在feedback反馈。

当你将flutter sdk版本的最低版本至少2.12着意味着你的app或者package仅支持空安全。

environment:
  sdk: ">=2.12.0-0 <3.0.0"
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;
            ^

以上代码展示了在修改flutter最低版本前后,编译器所做的不同表现和提示。

空安全迁移

  1. 依赖检查
migration_dart_null_safety.png

官方建议按照依赖顺序进行修改,避免上层依赖api的二次修改。为了检查某个依赖是否已经迁移完毕,可以使用dart pub outdated --mode=null-safety,如下所示:

pub_mode_null_safety.png

如果在minor新版中依赖支持了空安全,那么在Upgradable列中会展示新版本库。如果在修改了major版本号的新依赖库支持了空安全,那么在Resolvable列中会展示该库。

在pub.dev库中可以勾选Supports null safety选项来过滤支持了空安全的库。

pub_dev_null_safety.png
  1. 使用迁移工具

    如果你的依赖已经准备完毕,那么就可以使用dart migrate对推断出来的会为空的属性进行人工检查,如果不认可工具的修改提示,则可以认为进行修正。

migrate_tool.png
  1. 静态分析已迁移代码

    使用pub get命令更新packages,然后静态分析已迁移代码:

    Dart code:

    dart pub get
    dart analyze
    Flutter code:

    flutter pub get
    flutter analyze

  2. Ensure tests pass

检查测试用例中出现的对于null的判断,也许需要修改为不再允许出现null值。

  1. 发布空安全包

    在迁移完成和测试用例通过之后,你可以发布一个预发布版本。提高包的主版本号,比如2.3.0为3.0.0,既能让使用者在准备充分之后升级,也能给开发者足够的时间去重构API。

    预发布版本版本号规则,比如使用use 3.0.0-nullsafety.0, not 3.0.0

健全的空安全的好处

更安全的代码

官方给出了以下如下内部评审实际的发现的问题作为例子:

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) {
    ...

对于以上代码,如果独立来看也许会发现major和minor肯能会为null,但是在实际代码review过程中也一直没有发现问题。但是现在对于空安全静态分析会直接给出错误提示。

null_safety_static_analysis.png

除了上诉例子以外,还有其他问题如下:

  • 内部团队发现针对空安全判断不会为null的值依然有判空的代码。这种情况比较多的出现在protobuf中,对于未设置值的可选字段,只会返回默认的非null值,这就使得部分开发者会做出不正确的默认判断条件,混淆了默认值和null值。
  • 在Flutter代码中,如果访问widget的context之外的状态对象,在空安全之前,这将会返回null并且不易被发现,在空安全检查之后,将被认为不会为null并且抛出分析错误。
  • flutter团队发现flutter引擎存在一个bug,如果传递一个null给Window.render()的scene参数,就会报错。然后在空安全迁移的时候可以将该参数标记为非null。

编译空安全项目的杠杆作用

健全的空安全可以使编译器利用可空性信息使编译出来的代码更小更快。

对于最简单的hello world项目,在未压缩情况下体积可以减少3.5%安装包大小,而对于Flutter Framework则可以减少3.9%。

至于代码速度,强制的健全的类型系统可能会增加开销,适当的空检查也可以提升代码执行速度。基于benchmark的初始化分析表示和之前的发布版本也处于同一水平,但是新的类型信息也为将来的新的性能提升提供了可能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335