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