简介

null可能是大家在编写程序中最为头疼的一个东西,稍不留意的情况下就有可能使用到了这个空字符。所以dart在2.12引入了nll safety,默认情况下强制所有的类型都不为null,只有在你认为它可以为null的时候才可以设置为null。

虽然有了null safety,但是这里还有一些我们需要考虑的null的最佳实践。

不需要初始化对象为null

在dart2.12之后,所有的对象都强制为非空的,除非你显示指定其为可空的对象。

如果一个对象可以为空,那么我们可以这样指定:

String? name;

如果定义一个对象可以为空,那么对dart来说会隐式对其初始化为null。

所以下面的显示初始化为null是完全没有必要的:

String? name=null;

同样的,如果参数是一个可以为空的对象,那么dart也会将其初始化为null,我们也没有必要显示去设置其值:

void echoName(String? name){
print(name);
}

null的三元操作符

所谓三元就是有三个变量,我们常见的三元操作符就是?:,通常来说是这样用的:

name==null?true:false;

上面的逻辑实际上是把一个null转换成了一个bool类型。

为了实现这个功能,dart提供了一个更加简洁的操作符??, 可以这样使用:

name??false;

上面的代码表示如果name是空,则返回false。

注意,这里只是返回值改变了,但是name值本身并没有变化,也不会将name从一个可为空的类型,变成不为空的类型。所以如果我们在if语句里面对字符进行判断,则还是需要显示进行null的比较:

int measureMessage(String? message) {
if (message != null && message.isNotEmpty) {
// dart知道message不为空
return message.length;
} return 0;
}

如果这样编写,则会出现异常:

int measureMessage(String? message) {
if (message?.isNotEmpty ?? false) {
//dart并不知道message不为空
return message!.length;
} return 0;
}

如果在使用中需要判断类型是否为空,则不要使用late

late是做什么用的呢?late表示该类型目前不会初始化,但是会在未来的某个时间对其进行初始化。

所以,如果你用late表示某个类型,那么在后续使用的时候是不需要进行手动判断该类型是否为空的。

如果你仍然要手动判断,那么就没必要设置该类型为late。

本地变量的类型提升

dart有一个非常好的特性,就是当我们判断一个变量不为空之后,该变量就会被提升为非空变量。

当提升为非空变量之后,就可以自由访问该非空变量内部的属性和方法了。

但是可惜的是,dart中的类型提升只是针对与local变量或者参数而言的,对于类变量或者是top level的变量并不适用,所以我们需要将这些变量拷贝到本地变量,从而使用类型提升的特性。

我们看下面的例子:

class UploadException {
final Response? response; UploadException([this.response]); @override
String toString() {
var response = this.response;
if (response != null) {
return 'Could not complete upload to ${response.url} '
'(error code ${response.errorCode}): ${response.reason}.';
} return 'Could not upload (no response).';
}
}

其中UploadException中的response是一个顶级变量,虽然我们对其进行测试是否为空,但是在使用的过程中还是不能直接访问其内部的属性,因为response可能为空。

为了使用dart的类型提升的特性,我们可以将顶级的变量赋值给一个本地变量,从而在null测试之后,自动将其提升为非空的类型,从而直接访问其内部的属性。

总结

以上就是dart中null用法的最佳实践。

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

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

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

dart系列之:和null说再见,null使用最佳实践的更多相关文章

  1. dart系列之:安全看我,dart中的安全特性null safety

    目录 简介 Non-nullable类型 Nullable List Of Strings 和 List Of Nullable Strings !操作符 late关键字 总结 简介 在Dart 2. ...

  2. Mysql高手系列 - 第13篇:细说NULL导致的神坑,让人防不胜防

    这是Mysql系列第13篇. 环境:mysql5.7.25,cmd命令中进行演示. 当数据的值为NULL的时候,可能出现各种意想不到的效果,让人防不胜防,我们来看看NULL导致的各种神坑,如何避免? ...

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

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

  4. dart系列之:dart语言中的内置类型

    目录 简介 Null 数字 字符串 布尔值 列表 set和map 简介 和所有的编程语言一样,dart有他内置的语言类型,这些内置类型都继承自Object,当然这些内置类型是dart语言的基础,只有掌 ...

  5. IOS开发遇到(null)与<null>轻松处理

    在ios开发中不可避免的我们会遇到服务器返回的值有空值,但是如果是nil也就算了还可能得到(null)以及<null>的返回值,该如何处理呢?(当然有的字典转模型中已处理,可以通过遍历等) ...

  6. com.opensymphony.xwork2.ognl.OgnlValueStack] - target is null for setProperty(null, "emailTypeNo", [Ljava.lang.String;@6f205e]

    情况1,查询结果未转换为与前台交互的实体类DTO 实体类:EmailTypeDto package com.manage.email.dto; public class EmailTypeDto { ...

  7. ognl.OgnlException: target is null for setProperty(null, "emailTypeNo", [Ljava.lang.String;@1513fd0)

    [com.opensymphony.xwork2.ognl.OgnlValueStack] - Error setting expression 'emaiTypeDto.emailTypeNo' w ...

  8. SQL语句中=null和is null

    平时经常会遇到这两种写法:IS NOT NULL与!=NULL.也经常会遇到数据库有符合条件!=NULL的数据,但是返回为空集合.实际上,是由于对二者使用区别理解不透彻. 默认情况下,推荐使用 IS ...

  9. mysql探究之null与not null

    相信很多用了mysql很久的人,对这两个字段属性的概念还不是很清楚,一般会有以下疑问: 1.我字段类型是not null,为什么我可以插入空值 2.为毛not null的效率比null高 3.判断字段 ...

随机推荐

  1. M-SOLUTIONS Programming Contest 2021(AtCoder Beginner Contest 232) 题解

    目录 G - Modulo Shortest Path H - King's Tour 因为偷懒就只写G和H的题解了. G - Modulo Shortest Path 首先可以观察到对于一条从点\( ...

  2. Centos7使用Docker启动elasticsearch服务秒退

    首先查看docker启动日志 docker logs -f 容器id 查看报错信息 OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepG ...

  3. 【九度OJ】题目1199:找位置 解题报告

    [九度OJ]题目1199:找位置 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1199 题目描述: 对给定的一个字符串,找出有重复的 ...

  4. 【LeetCode】923. 3Sum With Multiplicity 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/3sum-wit ...

  5. 【LeetCode】343. Integer Break 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学解法 动态规划 日期 题目地址:https:// ...

  6. LeetCode118. Pascal's Triangle 杨辉三角

    题目 给定行数,生成对应的杨辉三角 思考 同一行是对称的,最大的下标为(行数+1)/2;1,1,2,3,6;下标从0开始,则对应分别为0.0.1.1.2.2 对于第偶数行,个数也是偶数,对于奇数行,个 ...

  7. Dubbo 的设计思想

    在java远程调用多年的沉淀 <1>首先是socket调用.在orderService中开放socket服务,在userService中进行远程调用. 优点:解决了单机调用的问题. 缺点: ...

  8. Laravel 使用 maatwebsite/Excel 3.1 实现导入导出的简单方法

    官方文档 https://docs.laravel-excel.com/3.1/getting-started git地址 https://github.com/maatwebsite/Laravel ...

  9. 分布式抽奖秒杀系统,DDD架构设计和实现分享

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.用大项目,贯穿知识体系 写CRUD.堆API.改屎山⛰,熬多少个996也只是成为重复的螺丝 ...

  10. SpringBoot集成log4j,解决log4j.properties不生效问题

    Spring Boot集成log4j其实比较简单,maven的话,在xml中增加log4j依赖就行 <dependency> <groupId>org.springframew ...