Dart 如何优雅的避空

A?.B
如果 A 等于 null,那么 A?.B 为 null
如果 A 不等于 null,那么 A?.B 等价于 A.B

Sample:

void main() {
Animal animal = new Animal(‘cat’);
Animal empty = null;

//animal 非空,返回 animal.name 的值 cat
print(animal?.name);
//empty 为空,返回 null
print(empty?.name);

//animal 非空,可以直接访问 animal.name 的值 cat
print(animal.name);
//empty 为空,抛出异常
print(empty.name);
}

class Animal {
final String name;
Animal(this.name);
}

大家拷贝代码然后替换在线编辑器的内容,运行后会看到如下输出:

cat
null
cat
Uncaught exception:
Cannot read property ‘get$name’ of null

可以看到假设左边不为空,不管是使用**?.还是直接用我们熟悉的.访问变量都是没问题的。
但是如果左边为空,使用
?.会返回null**。但是直接使用**.**会直接抛出异常。

3. dart ??

dart 语法糖 ??

它的意思是左边如果为空返回右边的值,否则不处理。

A??B
如果 A 等于 null,那么 A??B 为 B
如果 A 不等于 null,那么 A??B 为 A

以上面为例子,假设我们上面要求当 empty 为空时,默认值输出 unknown。

那么可以修改如下:

//empty 为空,返回 null
print(empty?.name);

改为

//empty 为空,本来要返回 null,由于有 ??,返回 unknown
print(empty?.name??‘unknown’);

这样就不会返回 null 而是返回 unknown。

同样的大家可以试下返回 cat 的语句如果加上这个会怎样,可以预见是不会改变的。

4. dart ?. ?? 优雅所在

这边举例说明下使用 ?. ?? 语法糖和不使用的对比。

void main() {
C c = new C(‘Case 1’);
B b = new B©;
A a = new A(b);

// C c = new C(null);
// B b = new B©;
// A a = new A(b);

// C c = new C(‘Case 2’);
// B b = null;
// A a = new A(b);

//直接使用.来最终获取 c 的变量 value
if (a != null && a.bMember != null && a.bMember.cMember != null) {
print(a.bMember.cMember.value);
} else {
print(null);
}

//直接使用.来最终获取 c 的变量 value,为空时返回 unknown
if (a != null && a.bMember != null && a.bMember.cMember != null) {
String value = a.bMember.cMember.value;
if (value == null) {
value = ‘unknown’;
}
print(value);
} else {
print(‘unknown’);
}

//dart 使用?.来最终获取 c 的变量 value
print(a?.bMember?.cMember?.value);
//dart 使用?.来最终获取 c 的变量 value,为空时使用 ?? 返回 unknown
print(a?.bMember?.cMember?.value??‘unknown’);
}

class A {
final B bMember;
A(this.bMember);
}

class B {
final C cMember;
B(this.cMember);
}

class C {
final String value;
C(this.value);
}

这里面有三个 case,另外两个 case 暂时注释掉。

这三个 case 的结果分别为:

Case 1
Case 1
Case 1
Case 1

null
unknown
null
unknown

null
unknown
null
unknown

可以看到 dart 的语法糖很优雅,一行全搞定。

5. print 方法遇到 null

下面这个例子:

void main() {
String a = null;
print(‘exception=’+a);
}

你觉得结果是 exception=null 吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结果是

Uncaught exception:
Invalid argument: null

原因是因为 print 里面连接的必须是字符串。

因为这里 a 确实是字符串,所以编辑器没有报错。

假设这里 a 为一个对象 A 的变量,会报如下提示:

The argument type ‘A’ can’t be assigned to the parameter type ‘String’.

那我们怎么处理?

有两种方法。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

学习分享

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

(img-mcw1pZ4R-1712256546544)]

[外链图片转存中…(img-oWJeREuz-1712256546544)]

[外链图片转存中…(img-ER2kPPxV-1712256546545)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值