【开发经验】Flutter中对 Function/嵌套Map 安全取值

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);

End

    原文作者:马嘉伦
    原文地址: https://segmentfault.com/a/1190000020251716
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞