Flutter 为什么我可以做三元而不是if语句

Flutter 为什么我可以做三元而不是if语句,flutter,dart,Flutter,Dart,为什么第一个有效,而第二个无效?第一个的问题是null抛出断言异常,因为小部件不能为null。这种情况下的最佳实践是什么 行( 子项:listOfWidgets!=null?listOfWidgets:null ) 行( 子项:if(listOfWidgets!=null)listOfWidgets; ) 当前解决方法: void List\u rowWidgets(){ if(listOfWidgets!=null)返回listOfWidgets; } 划船( 子项:_rowWidgets

为什么第一个有效,而第二个无效?第一个的问题是null抛出断言异常,因为小部件不能为null。这种情况下的最佳实践是什么

行(
子项:listOfWidgets!=null?listOfWidgets:null
)
行(
子项:if(listOfWidgets!=null)listOfWidgets;
)
当前解决方法:

void List\u rowWidgets(){
if(listOfWidgets!=null)返回listOfWidgets;
}
划船(
子项:_rowWidgets();
)

第一种情况下,三元数的形式是
语句?a:b
,并始终返回或
a
b
。这就是诀窍,三元总是有一个返回语句,即使我们看不到它。默认情况下,
if
没有该语句,因此如果需要,需要显式声明返回。

第一种情况下,三元语句的形式是
语句?a:b
,并始终返回或
a
b
。这就是诀窍,三元总是有一个返回语句,即使我们看不到它。默认情况下,
if
没有该语句,因此如果需要,您需要显式声明返回。

列出的三个选项中的每一个都有自己的问题,因此我将分别解决它们


问题:

行(
子项:listOfWidgets!=null?listOfWidgets:null,
)
解决方案:

行(
子项:listOfWidgets!=null?listOfWidgets:[],
)
解释

这很好,除非
listofWidgets
为空。这将导致三元运算符返回
null
,并且
Row
不允许其
子属性为null。您需要给它一个非空的默认值,比如
[]


问题:

行(
子项:if(listOfWidgets!=null)listOfWidgets;
)
解决方案:

行(
子项:[如果(listOfWidgets!=null)…listOfWidgets],
)
说明:

这种语法在Dart中是错误的,因为不能有这样的嵌套
if
语句
if
语句必须存在于自己的live of代码中,或者(自Dart 2.3以来)嵌套在列表/映射文本中。如果执行嵌套列表文字路由,还需要
listOfWidgets
上的扩展运算符
,将其扩展到另一个列表中。否则,您将尝试将列表放入列表中,而
不允许您这样做


问题:

void List\u rowWidgets(){
if(listOfWidgets!=null)返回listOfWidgets;
}
划船(
子项:_rowWidgets();
)
解决方案:

List\u rowWidgets(){
if(listOfWidgets!=null)返回listOfWidgets;
返回[];
}
划船(
子项:_rowWidgets(),
)
忽略更明显的语法错误(需要逗号的分号,双返回类型),这个问题类似于三元问题,尽管有点微妙。在Dart中,每个不将
void
作为返回类型的方法都必须返回某些内容。如果没有显式返回某些内容,默认情况下,该方法将返回
null
。这是在您的
\uRowWidgets
方法中发生的情况-如果
listOfWidgets
为null,您不会声明将返回什么,因此在这种情况下,Dart将为您返回
null
。就像三元问题一样,
将不允许
子项


总体建议:

行(
子项:listOfWidgets???[],
)
说明:

最后,您所关心的是,如果
listOfWidgets
恰好为空,则确保
接收非空值。Dart有一个完美的操作符:空合并操作符
??
。它所做的是返回左边的值,除非该值为
null
,在这种情况下,它返回右边的值

为了更清楚地说明这一点,以下代码行的执行方式相同:

//如果选项
if(listOfWidgets!=null)返回listOfWidgets;
否则返回[];
//三元期权
返回Widgets列表!=无效的listOfWidgets:[];
//空合并选项
返回Widgets列表??[];

列出的三个选项中的每一个都有自己的问题,因此我将分别解决它们


问题:

行(
子项:listOfWidgets!=null?listOfWidgets:null,
)
解决方案:

行(
子项:listOfWidgets!=null?listOfWidgets:[],
)
解释

这很好,除非
listofWidgets
为空。这将导致三元运算符返回
null
,并且
Row
不允许其
子属性为null。您需要给它一个非空的默认值,比如
[]


问题:

行(
子项:if(listOfWidgets!=null)listOfWidgets;
)
解决方案:

行(
子项:[如果(listOfWidgets!=null)…listOfWidgets],
)
说明:

这种语法在Dart中是错误的,因为不能有这样的嵌套
if
语句
if
语句必须存在于自己的live of代码中,或者(自Dart 2.3以来)嵌套在列表/映射文本中。如果执行嵌套列表文字路由,还需要
listOfWidgets
上的扩展运算符
,将其扩展到另一个列表中。否则,您将尝试将列表放入列表中,而
不允许您这样做


问题:

void List\u rowWidgets(){