不同的行为三元运算符 - if/else with spread operator (...)

Different behavior ternary operator - if/else with spread operator (...)

为什么以下代码适用于 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 效果很好,但是当我尝试用三元运算符做同样的事情时,我得到了错误。

我尝试了几种括号组合,但 none 对我有用。

使用最简单的模式,如注释代码,我在 Dart 分析中得到 3 个错误:

不应表现出与 if/else 相同的三元运算符?

为什么会出现这些错误?

有谁知道使用三元运算符的正确语法是什么?

谢谢!

您对三元运算符的使用不起作用,因为每个“then”和“else”操作数(以及三元运算符本身的结果)都必须计算为一个表达式,而扩展运算符 (...) 不产生表达式。展开运算符(以及 collection-if 和 collection-for)取而代之的是计算一个或多个集合 元素 。 (强烈推荐阅读 Bob Nystrom's article that discusses the design of these language features。)

如果您将展开运算符移出,您对三元运算符的使用将会起作用:

...(isLogged ? loggedRows(context) : [loginRow(context)]),

虽然这更尴尬,因为如果 isLogged 为假,它会创建一个额外的 List。使用 collection-if 会更适合这种用法。