Dart 如何优雅的避空

Author Avatar
Bruce Yang 3月 20, 2019
  • 在其它设备中阅读本文章

对于每一个程序员来说,空指针异常应该是基本都会遇到过的异常,而且这个异常出现的概率还比较大。
但是,空指针异常又是最容易解决的异常,因为只要加个非空判断就可以避免了。
本篇通过对比一般非空判断和 dart 特有的语法糖告诉你如何使用 dart 进行优雅的避空。

dart ?.

dart 语法糖 ?.

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

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

dart ??

dart 语法糖 ??

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

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

dart ?. ?? 优雅所在

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

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

//   C c = new C(null);
//   B b = new B(c);
//   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 的语法糖很优雅,一行全搞定。

作者:AndroidTraveler
链接:https://juejin.im/post/5c70fc666fb9a049cd54d206
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。