为什么映射可为 null 的集合在 dart 中总是不为空?
Why mapping nullable collection is always not null in dart?
1 factory SuggestSessionResult.fromJson(Map<String, dynamic> json) {
2 final String? error = json['error'];
3 final List<Map<String, dynamic>>? items = json['items'];
4 return SuggestSessionResult(
5 items
6 ?.map((it)=>SuggestItem.fromJson(it))
7 .toList(),
8 error
);
}
您好!
如您所见,我没有在第 7 行中使用 null-aware 运算符,这对编译器来说没问题。此外,当我使用它时,分析器说接收器不能为空。
为什么会这样?
在 Dart 2.12 中,?.
被短路了。
来自 Understanding null safety 文档:
To address this, we borrowed a smart idea from C#’s design of the same feature. When you use a null-aware operator in a method chain, if the receiver evaluates to null
, then the entire rest of the method chain is short-circuited and skipped.
在你的情况下,.map()
,如果被调用,不能return null
(因为Iterable.map
不会return 可空类型)。因此 .toList()
要么永远不会被调用(因为 .map()
没有在方法链的前面调用),要么保证在非空值上被调用。
1 factory SuggestSessionResult.fromJson(Map<String, dynamic> json) {
2 final String? error = json['error'];
3 final List<Map<String, dynamic>>? items = json['items'];
4 return SuggestSessionResult(
5 items
6 ?.map((it)=>SuggestItem.fromJson(it))
7 .toList(),
8 error
);
}
您好! 如您所见,我没有在第 7 行中使用 null-aware 运算符,这对编译器来说没问题。此外,当我使用它时,分析器说接收器不能为空。 为什么会这样?
在 Dart 2.12 中,?.
被短路了。
来自 Understanding null safety 文档:
To address this, we borrowed a smart idea from C#’s design of the same feature. When you use a null-aware operator in a method chain, if the receiver evaluates to
null
, then the entire rest of the method chain is short-circuited and skipped.
在你的情况下,.map()
,如果被调用,不能return null
(因为Iterable.map
不会return 可空类型)。因此 .toList()
要么永远不会被调用(因为 .map()
没有在方法链的前面调用),要么保证在非空值上被调用。