Flutter 为什么我可以做三元而不是if语句
为什么第一个有效,而第二个无效?第一个的问题是null抛出断言异常,因为小部件不能为null。这种情况下的最佳实践是什么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
行(
子项: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(){