【问题标题】:Flutter: Does it matter what code is in setState()?Flutter:setState() 中的代码是否重要?
【发布时间】:2018-10-03 11:05:18
【问题描述】:

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

【问题讨论】:

    标签: dart state flutter setstate


    【解决方案1】:

    根据docs

    @protected
    
    void setState (
        VoidCallback fn
    )
    

    通知框架这个对象的内部状态有 改变了。

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

    setState(() { _myState = newValue });

    提供的回调会立即同步调用。它不能 返回一个未来(回调不能是异步的),从那时起它将是 不清楚实际设置状态的时间。

    还有

    一般建议setState方法只用于 包装对状态的实际更改,而不是任何可能的计算 与更改相关联。

    它没有明确说明在函数内部或外部调用 is 是否不同。但它确实建议把它放在里面。在我看来,如果您将更改放在 setState 函数中,它也更具可读性和逻辑性

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • API 保证 setState 被立即调用的一部分,建议只在内部进行突变是出于可读性目的。
      猜你喜欢
      • 1970-01-01
      • 2015-07-22
      • 2013-09-15
      • 2019-03-16
      • 2020-09-16
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多