为什么下面的代码可以很好地使用if/else而不能使用三元操作符?
ListView(
children: [
// Commented code not working
// isLogged ? ...loggedRows(context) : loginRow(context),
// Working code
if (isLogged)
...loggedRows(context)
else
loginRow(context),
ListTile(...),
ListTile(...),
])
loggedRows和loginRow方法:
ListTile loginRow(BuildContext context) {
return ListTile(...)
}
List<ListTile> loggedRows(BuildContext context) {
return [ListTile(...), ListTile(...)];
}
我尝试显示不同的ListTiles取决于用户是否登录,它可以完美地使用if/else,但当我尝试用三元操作符做同样的事情时,我得到错误。
我尝试了几种括号组合,但没有一种适合我。
使用最简单的模式,如注释代码,我在Dart分析中得到3个错误:
- 期望找到']'.
- 期望找到'.'.
- 期望一个标识符。
不应该表现出与if/else相同的三元操作符吗?
为什么我得到这些错误?
有谁知道使用三元运算符应该是正确的语法吗?
您使用的三元运算符不起作用,因为每个&;then&;和";else"操作数(因此三元运算符本身的结果)必须求值为表达式,而扩展运算符(...
)不产生表达式。扩展运算符(以及collection-if
和collection-for
)的计算结果为一个或多个集合元素。(我强烈推荐阅读Bob Nystrom关于这些语言特性设计的文章。)
如果将展开操作符移出,则可以使用三元操作符:
...(isLogged ? loggedRows(context) : [loginRow(context)]),
,虽然这更尴尬,因为它创建了一个额外的List
,如果isLogged
是假的。对于这种用法,使用collection-if
会更合适。