dart lang中的问号和点

时间:2019-05-20 14:33:16

标签: dart flutter

说我定义了...

final DocumentSnapshot doc;

变量doc可能为null,因此我像这样使用问号和点。.

print(widget.doc); // null
print(widget.doc == null); // true
print(widget.doc?.data['name']);

为什么widget.doc?.data['name']抛出错误Tried calling: []("name")而不是返回null

据我了解,?.检查是否null,是否返回null

2 个答案:

答案 0 :(得分:3)

在当前版本的Dart(2.3)中,空感知访问不会使呼叫链短路。

因此,如果a?.b.c为空,则a将引发异常,因为它与(a != null ? a.b : null).c相同。

在您的情况下,widget.doc?.data['name']((e) { return e != null ? e.data : null; }(widget.doc))['name']相同。

要使代码正常工作,您需要引入一个变量。

var a = widget.doc?.data;
print(a == null ? null : a['name']);

注意:您可能对#36541: Map does not have a null-aware-chainable "get" method

感兴趣

答案 1 :(得分:1)

要保护对可能为 null 的对象的属性或方法的访问,请在点 (?) 前放置一个问号 (.):

myObject?.someProperty

前面的代码等价于以下内容:

(myObject != null) ? myObject.someProperty : null

您可以链接多个 ? 的用途。在一个表达式中:

myObject?.someProperty?.someMethod()

如果 someMethod()myObject 为 null,则前面的代码返回 null(并且从不调用 myObject.someProperty)。

代码示例 尝试使用条件属性访问来完成下面的代码片段。

// This method should return the uppercase version of `str`
// or null if `str` is null.
String upperCaseIt(String str) {
  return str?.toUpperCase();
}