共计 1043 个字符,预计需要花费 3 分钟才能阅读完成。
Dart 的空值判断
Dart 语言已经提供了很多语法糖来改善判断空值的写法,但是还是有两种情况不容易判断:
判断 function
是否为空
此时需要这样往往需要这样写代码:
问题代码
Function(String) filter;
// 一定要写一个 if,其实很不优雅
if(filter){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['info']['remark']; // 取不存在的 key,再取值就回报错
因为有时调用的 Api 并不完全可靠,我们当然不希望云端的 json 结构变化就直接导致我们整个程序报错。
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 后继续取值, 不会报错:');
print(SafeMap(map)['info']['asdfgh'].value);
End
正文完