开发经验Flutter中对-Function嵌套Map-判断空值

65次阅读

共计 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

正文完
 0