当我们想要重建StatefulWidget时,我们调用setState()
但是,如果我们输入的代码在该函数内部或在其外部,那真的很重要吗?
这是:
class _ShoppingListState extends State<ShoppingList> {
Set<Product> _shoppingCart = new Set<Product>();
void _handleCartChanged(Product product, bool inCart) {
setState(() {
if (inCart)
_shoppingCart.add(product);
else
_shoppingCart.remove(product);
});
}
}
与此相同:
class _ShoppingListState extends State<ShoppingList> {
Set<Product> _shoppingCart = new Set<Product>();
void _handleCartChanged(Product product, bool inCart) {
if (inCart)
_shoppingCart.add(product);
else
_shoppingCart.remove(product);
});
setState((){});
}
}
答案 0 :(得分:9)
根据docs:
@protected void setState ( VoidCallback fn )
通知框架该对象的内部状态 改变。
每当您更改State对象的内部状态时,请创建 更改传递给setState的函数:
setState(() { _myState = newValue });
立即同步调用提供的回调。一定不能 返回一个未来(回调不能是异步),从那以后就会出现 目前尚不清楚该州何时实际上已经确定。
还
通常建议仅使用setState方法 将实际更改包装到状态,而不是任何可能的计算 与变化有关。
它没有明确说出任何关于调用是否在函数内部或外部的事情。但它确实建议把它放进去。在我看来,如果你把改变放在setState
函数的一边
答案 1 :(得分:3)
你应该在闭包内进行所有突变,并在闭包之外进行计算。
为什么?因为setState
可能不会立即被调用。因此,与此同时,如果其他东西强制刷新您的小部件,您可能会有一个未定义的行为。
这通常不是问题。但遵循这条规则会更安全。