我对 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');
之类的表达式完成的。
最佳答案
这是我很想回答的有趣问题之一。
正如官方文档所说的 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
作为结果返回,否则请不要使用它
回复编辑:
让我为您分解函数调用和结果。所以你的代码是这样的,
() => {
setState(() {
return {
print('hello'),
_products.add('More stuff'),
};
})
}
这里 =>
返回一个带有 setState
结果的 Set
,即它会返回 { (setState 的结果call) }
这可能是 { null }
当您调用 setState
时,将执行以下代码,该代码再次返回带有 { 的
Set
(打印结果),(_product.add 的结果), }
() {
return {
print('hello'),
_products.add('More stuff'),
};
}
状态会随着您执行 _products.add('More stuff')
而更新,其中 'More stuff'
将被添加到 _products
无论你在哪里调用它。当调用 setState
时,将使用 _products
重新构建小部件并添加新数据。
希望这有帮助!
https://stackoverflow.com/questions/55350820/