Flutter2 来了
2021年3月最大的猿圈事件莫过于Flutter Engage上,Flutter2的官宣了。
我从燃爆的Flutter2登场视频上感受到了一个由Flutter引领的大前端新纪元的开始。

目前的官网上有三个关于flutter2的链接.

Flutter 2 is here!
Announcing Flutter 2
Announcing stable web
现在你只需要写一份代码就可以支持几乎所有平台:android, iOS, macos, linux, windows,web 甚至是嵌入式平台。

从此我们可以集中人力、物力、精力把业务做好,跨平台的事就交给Flutter吧。

Flutter2中有一个很重要新特性是可以帮你把app做好的。

那就是:全面空安全(Sound null safety)以下简称空安全。

什么是全面空安全(Sound null safety)
我们不妨将其理解为,你的变量不能包含null,除非你明确声明他们可以为空。

有了这个空安全dart编译器能在编译阶段判断出空指针错误。

引入空安全目的不是消灭null,而是为开发者提供工具来掌握控制null的能力。

空安全有什么用
空安全的作用有三个层次:

编辑提示:可以在IDE中看到语法标红的线,编译器提醒发现语法错误
提前发现:使得原本在运行时才能发现的错误,在编译时就能被发现了。
性能提升:获得大小和速度方面的改进
空安全长什么样
非空安全    空安全

整个dart世界的顶层类不再是Object而是Object?
底层类不再是Null而是Never

基础
默认情况下,所有变量都是非空的

空安全里面有“?”

变量类型声明后面的问号:

//如果想声明一个变量既可以是个int,也可以为空,只需要给这个变量的类型声明加个问号
int? aNullableInt = null;
函数返回值类型后面的问号:

//返回值类型加问号代表可以返int,也可返回空
int? getIndex() {
  return 1;
}
 
空安全里面有 ??
??操作符放在可空变量后面,操作符后面跟一个操作数。

表示当变量为空时变量值为该操作数。

//当aNullableInt为空时 value = 0
int value = aNullableInt ?? 0;
空安全里面有“!”
在某个场景中,如果开发者能够确保一个可空变量是非空变量可以给这个变量加!

例如:

int? getIndex() {
  return 1;
}
 
void main() {
  int? aNullableInt = null;
 
  List numbers = [1, 2, 3];
 
  aNullableInt = getIndex();
 
  //可以确保此处的aNullableInt是非空的
  print('numbers[${aNullableInt}]:${numbers[aNullableInt!]}');
}
 
空安全里面有“required”
required只能加在函数命名参数类型声明之前。

用来告诉编译器:“我后面会初始化这个变量”。

class MyHomePage extends StatelessWidget {
  // 当编译器误认为函数的参数是可空的,你可以通过required关键字来纠正它
  MyHomePage({Key? key, required this.title}) : super(key: key);
  //...
}
空安全里面有“late”
late关键字加在变量类型声明前。

用来告诉编译器:“我后面会初始化这个变量”。

class IntProvider {
  //你能确保一个变量在使用之前会被初始化为非空,但仍然被报错,你可以在变量的类型之前标记late
  late int aRealInt;
 
  IntProvider() {
    aRealInt = calculate();
  }
}
List和Map变样了
List<String?>?

类型    列表可以空    item可以空    描述
List<String>    No    No    包含非空字符串的非空列表
List<String>?    Yes    No    包含可空字符串的非空列表
List<String?>    No    Yes    包含非空字符串的可空列表
List<String?>?    Yes    Yes    包含可空字符串的可空列表
Map<String, int?>?

类型    Map可以空    item可以空
Map<String, int>    No    No*
Map<String, int>?    Yes    No*
Map<String, int?>    No    Yes
Map<String, int?>?    Yes    Yes
实战:如何迁移你的应用到空安全
迁移套路:
1. 模块顺序
先迁移被依赖的模块,再迁移依赖它的模块

我在迁移Flutterame的时候就是按照这个顺序迁移的:

modules/utils
modules/gallery
整个app
2. 三板斧
对于每个模块,我们都可以下面用这三板斧搞定:

1. 更新pub

dart pub get
2. 查看并修改依赖类库

查看依赖类库

➜ dart pub outdated --mode=null-safety
Showing dependencies that are currently not opted in to null-safety.
[✗] indicates versions without null safety support.
[✓] indicates versions opting in to null safety.
 
Package Name     Current  Upgradable  Resolvable  Latest
 
direct dependencies:
cupertino_icons  ✗1.0.0   ✓1.0.2      ✓1.0.2      ✓1.0.2
 
1 upgradable dependency is locked (in pubspec.lock) to an older version.
To update it, use `dart pub upgrade`.
修改依赖类库版本

打开模块下的pubspec.yaml文件修改dependencies下的类库版本

name: flutterame
#...
dependencies:
  flutter:
  # ...
  # 修改前 cupertino_icons: ^1.0.0
  cupertino_icons: ^1.0.2
#...
 
再次更新pub

dart pub get
3. 自动或手动迁移

自动迁移

dart migrate --apply-changes
在提交代码的时候可以查看有哪些改动,这些改动是否合理。

手动迁移

dart migrate
输出如下:

➜ dart migrate
Migrating /Users/admin/Documents/flutter/flutterame/modules/utils
 
See https://dart.dev/go/null-safety-migration for a migration guide.
 
Analyzing project...
[---------------------------------------------------------------------------------------------------------------------------------------------------------------------------|]No analysis issues found.
 
Generating migration suggestions...
[----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]
 
Compiling instrumentation information...
[----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]
 
View the migration suggestions by visiting:
 
  http://127.0.0.1:49736/Users/admin/Documents/flutter/flutterame/modules/utils?authToken=xNh-pu7B9Fo%3D
 
Use this interactive web view to review, improve, or apply the results.
When finished with the preview, hit ctrl-c to terminate this process.
 
If you make edits outside of the web view (in your IDE), use the 'Rerun from
sources' action.
然后打开"127.0.0.1:49736..."那个链接你可以进入下面这个页面

可以选择相应文件,点击代码中的非空相关的判断(蓝色提示),然后你就能够在右下角看到dart编译器为什么会做出这些判断。你可以接受这个判断或者改变它。

迁移成果:
完成迁移之后,我对比了迁移前后的app size差别。

3.8M的libapp.so减少了124.7k

既能减少错误,又能减小体积,你还等什么,赶快把你的项目迁移到空安全吧!

然后你的项目就可以重新打一个版本号publish到pub上面就可以了,官方会自动给你打上null safety标签。

参考:
Sound null safety

Migrating to null safety

相关视频:

Dart 的空类型安全

Dart 语言健全的空安全机制

将应用迁移至 null safety (Migrating a Package to null safety)

转载请保持文章完整性并注明出处, 原文地址:https://www.jianshu.com/p/7ad5dddf0549

如果你觉得本文有用就点个 赞 吧❤️

如果你觉得这篇文章可能帮到别人就转发一下吧

————————————————
版权声明:本文为CSDN博主「Cao_Shixin攻城狮」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/BUG_delete/article/details/115076100

Flutter2 的 Sound null safety ?!以及发布pub上面的null safety标签实现相关推荐

  1. [你必须知道的.NET]第二十一回:认识全面的null

    <你必须知道的.NET>网站 | Anytao技术博客  [你必须知道的.NET]第二十一回:认识全面的null 发布日期:2008.7.31 作者:Anytao © 2008 Anyta ...

  2. php自动生成新闻页,自动发布新闻页面的php代码

    自动发布新闻页面的php代码 新闻文件以文本文件.txt的格式存放在一个固定的目录下,新闻的发布可以自动完成. 该过程由两部分组成: 第一是新闻的显示,由shownews.php脚本实现,代码如下: ...

  3. 【转】[你必须知道的.NET]第二十一回:认识全面的null

    引用自:http://www.cnblogs.com/anytao/category/155694.html 作者:Anytao . 说在,开篇之前 null. nullable.??运算符.null ...

  4. mysql is null走索引_Mysql数据库索引IS NUll ,IS NOT NUll ,!= 是否走索引

    声明在前面 总结就是 不能单纯说 走和不走,需要看数据库版本,数据量等 ,希望不要引起大家的误会,也不要被标题党误导了. 1 数据库版本: 2 建表语句 CREATE TABLE s1 ( id IN ...

  5. 码云上传代码添加标签_[Android] 发布码云(Gitee)项目到JitPack(最全完整流程)

    最近把github上的代码都转移到了码云上,而且github上的仓库可以很方便的迁移到码云,所以老代码的迁移问题不用考虑. 之前使用 JCenter 发布了一个 GitHub 开源项目,JCenter ...

  6. oracle的count的null为0,count(字段)不统计null值

    在对有null值的字段进行count时,发现count(1)与count(字段)得到的记录不一样. 最后在ITPUB上朋友们的帮助下,解决了. 结论:1.count(1)与count(*)得到的结果一 ...

  7. 9月29日云栖精选夜读:武装到“牙齿”!阿里云发布史上最强企业云安全架构 11层防护...

    未来的企业都会基于云来搭建业务的安全系统,企业云安全架构(Cloud Security Compass)就是这么一份供上云企业参考的设计蓝图-- 企业可以像"建房子"一样,依据模块 ...

  8. HighNewTech:人类发布史上首张黑洞照片—1+17张高清图片讲解黑洞简史

    High&NewTech:人类发布史上首张黑洞照片-1+17张高清图片讲解黑洞简史 导读       科技圈大事件:天文学家捕获首张黑洞照片.爱因斯坦曾精准语言,霍金曾发现黑洞辐射,一个令众多 ...

  9. mysql中null值求和_sql求和涉及到null值

    SQL ISNULL().NVL().IFNULL() 和 COALESCE() 函数 请看下面的 "Products" 表: P_Id ProductName UnitPrice ...

最新文章

  1. 【翻译】A Next-Generation Smart Contract and Decentralized Application Platform
  2. python3 console input_Python console.colorize方法代码示例
  3. Hello,Expression Blend 4 (含Demo教程和源码)
  4. java的AutoCloseable接口
  5. NOI2012 Day2
  6. 【C语言】这是我能想到的最难的题了
  7. 绘制图像直方图 matplotlib
  8. sap快捷搜索菜单栏
  9. POJ 3009 Curling 2.0【带回溯DFS】
  10. Struts 2.2.3 DOS漏洞
  11. Android WAP NET 区别
  12. 人工神经网络的应用有哪些方面,人工神经网络在生活中的应用
  13. 标题: Excel地址 Excel单元格的地址表示很有趣,它使用字母来表示列号。 比如, A表示第1列, B表示第2列, Z表示第26列, AA表示第27列, AB表示第28列, BA表示第53列
  14. 在这做一个词云图生成器来送给大家(附代码),建议收藏
  15. 我把ConcurrentHashMap HashTable的知识点都整理了一下
  16. freeswitch借助fail2ban屏蔽骚扰注册
  17. 相见恨晚的5个资源网站 影视音乐资源随你看
  18. 3D卷积“LP-3DCNN: Unveiling Local Phase in 3D Convolutional Neural Networks”
  19. Kali学习 | 无线渗透:7.9 Arpspoof工具
  20. css+分散,【原】css实现两端对齐的3种方法

热门文章

  1. 基于SSM纺织品公司订单管理系统
  2. MyBatis知识汇总(第四篇)分页:LIMT(SQL方式),RowBounds(Java对象方式)
  3. Big Sur系统下的mac重置
  4. 46 同位语和同位语从句(以及) to/at/for/with 用法搭配
  5. 一种解决退出远程桌面后,电脑自动睡眠的方法
  6. 投我以木桃,报之以琼浆。匪报也,永以为好也!
  7. 《穹顶之下》全文整理
  8. 从 三江方士 的 中华级数 想到 数学的界限
  9. C-11 Problem H: 开宝箱2
  10. 控制器之间跳转实现转场动画,动画控制器概念