Flutter:setState()中的代码是否重要?

时间:2018-04-23 11:52:33

标签: dart state flutter setstate

当我们想要重建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((){});
  }
}

2 个答案:

答案 0 :(得分:9)

根据docs

@protected

void setState (
    VoidCallback fn
)
     

通知框架该对象的内部状态   改变。

     

每当您更改State对象的内部状态时,请创建   更改传递给setState的函数:

     

setState(() { _myState = newValue });

     

立即同步调用提供的回调。一定不能   返回一个未来(回调不能是异步),从那以后就会出现   目前尚不清楚该州何时实际上已经确定。

  

通常建议仅使用setState方法   将实际更改包装到状态,而不是任何可能的计算   与变化有关。

它没有明确说出任何关于调用是否在函数内部或外部的事情。但它确实建议把它放进去。在我看来,如果你把改变放在setState函数的一边

,它也更具可读性和逻辑性

答案 1 :(得分:3)

你应该在闭包内进行所有突变,并在闭包之外进行计算。

为什么?因为setState可能不会立即被调用。因此,与此同时,如果其他东西强制刷新您的小部件,您可能会有一个未定义的行为。 这通常不是问题。但遵循这条规则会更安全。