简介

在Dart 2.12中引入了null safety的新特性,也就是说dart程序中默认类型都是非空的,除非你显示告诉编译器,这个类型可以为空。

看起来是一个小小的改动,但是这个小小的改动导致了很多Dart包的大版本升级,从而导致使用Dart2.12之前的版本跟使用dart2.12之后的版本完全就是两个不同的世界。

真的这么奇妙吗?一起来看看Dart 2.12 null safety的特性吧。

Non-nullable类型

在感受Non-nullable类型之前,我们先看一段代码:

void main(){
String name;
print('name is $name.');
}

代码很简单,我们定义了一个String类型的name字符串,然后在print语句中打印它。

如果你是在dart 2.12版本之前,那么是没有问题的。

但是到了2.12,则会报错:

The non-nullable local variable 'name' must be assigned before it can be used.

Try giving it an initializer expression, or ensure that it's assigned on every execution path.

意思就是说,name是非空的,你必须要给他赋个值。

通过强制不为空,保证了代码的安全性,非常好用。

那么如果name就可以为空怎么处理呢?

别急,我们可以给可以为空的类型后面加上?即可:

void main(){
String? name;
print('name is $name.');
}

Nullable List Of Strings 和 List Of Nullable Strings

假如我们要创建一个List,list里面包含的是String,则可以这样创建:

List<String> aListOfStrings = ['one', 'two', 'three'];

在dart 2.12中,非空检查也被用到了泛型中,所以,默认情况下List中的String也不能为空,如果非要为空,则需要这样写:

List<String?> aListOfNullableStrings = ['one', null, 'three'];

对于list本身来说,它也是不能为空的,如果要为空,则需要这样写:

List<String>? aNullableListOfStrings;

!操作符

如果你认为某个对象在使用的时候确定不是null,那么可以在表达式后面添加!,如下所示:

  String? word;
word = aListOfNullableStrings.first;
print(word!.length);

late关键字

有时候,我们知道某个对象一定不是空,但是目前来说,并不能立刻对其进行赋值,这时候就需要使用到late关键字。

下面是一个用到late的例子:

class Team {
late final Coach coach;
} class Coach {
late final Team team;
} void main() {
final myTeam = Team();
final myCoach = Coach();
myTeam.coach = myCoach;
myCoach.team = myTeam; print('All done!');
}

上面的代码中,我们有两个类互相引用,但是两个类都是不为空的,如果不使用late,则会编译失败。

使用late就可以在后面合适的时候对类中的属性进行初始化,从而保证代码的运行。

总结

以上就是dart 2.12中新增加的null safety的使用。

本文已收录于 http://www.flydean.com/24-dart-null-safety/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

dart系列之:安全看我,dart中的安全特性null safety的更多相关文章

  1. dart系列之:实时通讯,在浏览器中使用WebSockets

    目录 简介 dart:html中的WebSockets 创建一个WebSocket WebSocket的状态 发送消息 处理WebSocket事件 总结 简介 web客户端和服务器端通信有两种方式,一 ...

  2. dart系列之:dart语言中的特殊操作符

    dart系列之:dart语言中的特殊操作符 目录 简介 普通操作符 类型测试操作符 条件运算符 级联符号 类中的自定义操作符 总结 简介 有运算就有操作符,dart中除了普通的算术运算的操作符之外,还 ...

  3. dart系列之:dart语言中的变量

    目录 简介 dart中的变量 定义变量 变量的默认值 Late变量 常量 总结 简介 flutter是google在2015年dart开发者峰会上推出的一种开源的移动UI构建框架,使用flutter可 ...

  4. dart系列之:dart类中的构造函数

    目录 简介 传统的构造函数 命名构造函数 构造函数的执行顺序 重定向构造函数 Constant构造函数 工厂构造函数 总结 简介 dart作为一种面向对象的语言,class是必不可少的.dart中所有 ...

  5. dart系列之:在dart中使用数字和字符串

    目录 简介 数字 字符串 StringBuffer 总结 简介 要想熟悉一种语言,最简单的做法就是熟悉dart提供的各种核心库.dart为我们提供了包括dart:core,dart:async,dar ...

  6. dart系列之:在dart中使用packages

    目录 简介 pubspec.yaml get packages 使用packages 升级依赖 总结 简介 java中使用jar包来封装有用的功能,然后将其分发到maven仓库中,供其他人使用.同样的 ...

  7. dart系列之:元世界pubspec.yaml文件详解

    目录 简介 pubspec.yaml支持的字段 一个例子 字段详情 总结 简介 pubspec.yaml是所有dart项目的灵魂,它包含了所有dart项目的依赖信息和其他元信息,所以pubspec.y ...

  8. dart系列之:dart优秀的秘诀-隔离机制

    目录 简介 dart中的隔离机制 生成一个Isolate Isolate之间的交互 一个例子 总结 简介 之前介绍了很多dart中的异步编程技巧,不知道大家有没有发现一个问题,如果是在java的异步编 ...

  9. dart系列之:和null说再见,null使用最佳实践

    目录 简介 不需要初始化对象为null null的三元操作符 如果在使用中需要判断类型是否为空,则不要使用late 本地变量的类型提升 总结 简介 null可能是大家在编写程序中最为头疼的一个东西,稍 ...

随机推荐

  1. 第03章_基本的SELECT语句

    第03章_基本的SELECT语句 1. SQL概述 1.1 SQL背景知识 1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖.在这几十年里,无数的技术.产业在这片江湖 ...

  2. 使用国内的镜像源搭建 kubernetes(k8s)集群

    1. 概述 老话说的好:努力学习,提高自己,让自己知道的比别人多,了解的别人多. 言归正传,之前我们聊了 Docker,随着业务的不断扩大,Docker 容器不断增多,物理机也不断增多,此时我们会发现 ...

  3. 【SpringBoot】(1)-- 基于eclipse配置springboot开发环境

    基于eclipse配置springboot开发环境 1. 下载并配置eclipse ① 前往eclipse官网 https://www.eclipse.org/downloads/packages/ ...

  4. UI自动化测试:App的WebView页面中,当搜索栏无搜索按钮时处理方法

    一.遇到的问题 在做移动端的UI自动化测试时,经常会遇到上图所示的搜索框,这里有个麻烦就是搜索框没有"搜索"按钮,UI自动化测试时不能确认搜索. 要解决这个问题,我们可以通过 dr ...

  5. xml的语法规则

    XML 文档必须有根元素 XML 文档必须有关闭标签 XML 标签对大小写敏感 XML 元素必须被正确的嵌套 XML 属性必须加引号 针对元数据的 XML 属性 有时候会向元素分配 ID 引用.这些 ...

  6. [省选联考 2021 A/B 卷] 图函数

    考虑到一件事情首先\(u -> u\)是可行的. 所以其实对于\(f(u,G')\) 只要考虑\([1,u]\)的点. 那么考虑其条件等价于\(u -> i\) 和 \(i -> u ...

  7. js浮点运算的坑

    1,js浮点型小数点运算的问题. 这么简单的计算,js竟然算的是错的,究其原因,是因为js小数在内存存储方式的原因. 具体原因: JavaScript 里的数字是采用 IEEE 754 标准的 64 ...

  8. javaSE中级篇3——集合体系(另外一种存储容器)——更新完毕

    集合还是一种工具,所以它们的包都在java.util包下 1.集合的整个体系结构(是需要掌握的体系,完全体系不是这样) 对图中所说的 序和重复 这两词的说明: 序:指的是添加进去的元素和取出来的元素 ...

  9. SQLITE_BTREE_H

    sqlite3.c, 237436行 = 全部源文件,找东西比多文件查找方便多了:-),字符串查找一点都不慢. 不要太害怕,SQLite说它的代码里有非常多是用来做数据完整性检查和测试的.但愿B树,虚 ...

  10. HDFS【概述、数据流】

    目录 概述 定义 优缺点 HDFS组成架构 HDFS文件块大小 HDFS数据流 写数据 读数据 网络拓扑-节点距离计算 机架感知(写数据的副本存储节点选择) 概述 定义 HDFS是一个分布式文件管理系 ...