不同的行为三元操作符- if/else与扩展操作符(…)



为什么下面的代码可以很好地使用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会更合适。

最新更新