不同的行为三元运算符 - 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
会更适合这种用法。
为什么以下代码适用于 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
会更适合这种用法。