Dart的空值判断
Dart语言已经提供了很多语法糖来改善判断空值的写法,但是还是有两种情况不容易判断:
判断function
是否为空
此时需要这样往往需要这样写代码:
问题代码
Function(String) filter;
// 一定要写一个if,其实很不优雅
if(filter != null){
filter('some string');
}
解决方案:使用?.call()
调用
Function(String) filter;
// 一行判断function是否为空,并执行function
filter?.call('some string');
对Map连续取值时,在过程中报错,无法安全取值
例如有Map如下:
Map map = {
'id': 3,
'tag': 'user',
'info': {
'name': 'Jerry',
//'age': 5,
}
};
如果取值就很容易报错:
问题代码
map['info']; // 取出map
map['info']['name']; // 取出'Jerry'
map['info2']['remark']; // 取不存在的key,再取值就回报错
// 我在项目中的代码,查询Accu的天气详情,这样会非常不稳定
source['Wind']['Speed']['Metric']['Value']
因为有时调用的Api并不完全可靠,我们当然不希望云端的json结构变化就直接导致我们整个程序报错。如果堆叠很多个if判断,会让程序难以阅读。
Tips:
javascript
中可以使用
map?.['info']
进行取值。
解决方案:封装SafeMap类,使其可以一直取值
思路很简单,重载[]
操作符即可
class SafeMap {
final dynamic value;
SafeMap(this.value);
SafeMap operator [](dynamic key) => SafeMap(
value is Map ? value[key] : null,
);
@override
String toString() => '<SafeMap:$value>';
}
使用:
Map map = {
'id': 3,
'tag': 'user',
'info': {
'name': 'Jerry',
'age': 5,
}
};
print('取map:');
print(SafeMap(map)['info'].value);
print('取值:');
print(SafeMap(map)['info']['name'].value);
// 此时如果不使用封装,对null使用[]操作符就会报错
// print(map['info']['asdfgh']);
print('取出空map后继续取值,不会报错,只会返回null:');
print(SafeMap(map)['info']['asdfgh'].value);