我对Dart / Flutter非常陌生,对=>表示法感到困惑。该文档说==表示法是返回单个表达式的简写。
bool isNoble(int atomicNumber)=> _nobleGases [atomicNumber]!= null;
当我试图在Flutter应用程序中设置状态时,我会怀疑。
RaisedButton(
onPressed: () => {
setState(() {
print('hello');
_products.add('More stuff');
})
},
child: Text('Add Product'),
),
现在,当我用=>表示法更改setState方法时
RaisedButton(
onPressed: () => {
setState(() => {
print('hello'),
_products.add('More stuff'),
})
},
child: Text('Add Product'),
),
上述两种方法均有效,即它们按预期设置状态。我要做的就是使用粗箭头符号将分号更改为逗号。
这背后的逻辑是什么?粗箭头符号如何与其中包含多个表达式的花括号一起使用。
修改
正如Hemanth Raj所提到的,=>返回一个集合,并且包含=>表示法的代码段可以编写如下。
RaisedButton(
onPressed: () => {
setState(() {
return {
print('hello'),
_products.add('More stuff'),
};
})
},
child: Text('Add Product'),
),
返回的set
包含打印功能和_products.add如何实际更新状态。它不应该引发某种错误,因为通常setState是由诸如_products.add('More stuff');
之类的表达式完成的。
答案 0 :(得分:3)
为记录起见,推荐的语法是:
RaisedButton(
onPressed: () {
setState(() {
print('hello');
_products.add('More stuff');
});
},
child: Text('Add Product'),
),
语法(args) => { statements }
不是 Dart编写函数体的方式,您可以执行(args) { statements }
或(args) => singleExpression
。
此外,您需要使用分号;
而不是逗号来终止语句。
正如其他人指出的那样,您使用的(args) => { print("something"), somethingElse }
语法实际上是在创建一个集合(Set<void>
是因为print
的返回类型是void
)并返回
这是一个小的语法错误的完美风暴,对于JavaScript程序员来说,这似乎是合理的,而这实际上意味着Dart中完全不同的东西。 而且,为了使情况变得更糟,代码起作用。 set文字将按顺序评估其表达式,无论如何都不会看到创建的set。语法只是不通用-您不能将任何表达式更改为for循环(不过,您将在下一版的Dart中使用)。
因此,在Dart中,除非您想要返回集合或地图,否则永远不要使用=> {
。
答案 1 :(得分:2)
这是我想回答的有趣问题之一。
正如官方文档所说的here,是的,=>
是{ return ... }
的简写语法,这意味着=>
只会返回右侧产生的任何内容。
从Dart 2.2
及更高版本开始,Set
可以用文档here中提到的用{}
括起来的逗号分隔值来定义。
因此,您正在使用的语法,即{}
,且语句之间用逗号分隔,Set
函数将其视为=>
。每个元素都是函数调用,() => { f(a) , f(b), g(a),}
将返回一个Set
以及每个函数调用返回的元素。
此示例可以帮助您了解实际情况:
dynamic reflect(dynamic a){
return a;
}
void main() {
Function shortHand = () => {reflect(1),reflect('a'),reflect({}),reflect([]),}; // this function when called will return a Set<dynamic>
print(shortHand().runtimeType); // will print `_LinkedHashSet<dynamic>`
}
所以语法
() => '...'
返回String
,
() => [ ... , ..., ...]
返回List
和类似的() => { ... , ... , ... }
实际上返回一个Set
注意:不建议使用这种用逗号分隔的函数调用返回set的方法,除非您希望将Set
作为结果返回,否则将要求您也不要使用它。 >
回复“编辑”:
让我为您分解函数调用和结果。所以你的代码是这样的,
() => {
setState(() {
return {
print('hello'),
_products.add('More stuff'),
};
})
}
这里=>
返回一个Set
,结果为setState
,即返回{ (result of setState call) }
,可能是{ null }
调用setState
后,以下代码将执行,该代码再次返回Set
和{ (result of print), (result of _product.add), }
() {
return {
print('hello'),
_products.add('More stuff'),
};
}
在执行_products.add('More stuff')
时,状态会更新,无论您在何处调用,'More stuff'
都会添加到_products
中。调用setState
时,将使用_products
重建小部件并添加新数据。
希望这对您有帮助!