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

Posted

技术标签:

【中文标题】Flutter:setState() 中的代码是不是重要?【英文标题】: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(());
  

【问题讨论】:

【参考方案1】:

根据docs:

@protected

void setState (
    VoidCallback fn
)

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

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

setState(() _myState = newValue );

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

还有

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

API 保证 setState 被立即调用的一部分,建议只在内部进行突变是出于可读性目的。

以上是关于Flutter:setState() 中的代码是不是重要?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 中的 AlertDialog 小部件无法使用 setState 功能

setState() 清除表单元素数据flutter中的数据

为啥 Flutter 中的 BloCListener 不保存状态,认证过程中出现 setState() 问题?

如何知道用户是不是停止在 Flutter 中拖出我的小部件?

Flutter 有状态的代码问题。在 setstate 中放啥?

在构建期间调用 setState() 或 markNeedsBuild(),使用 FutureBuilder 中的 Provider 和 Flutter 中的 StreamBuilder