Dart 为什么setState要关闭?
接受一个函数,然后立即调用它,然后请求重建,有什么好处?特别是,与用户显式调用“rebuild”类型函数相比,有什么优势?当Flatter有一个“markNeedsBuild”函数时,开发人员最终只是随机调用它。当语法切换到Dart 为什么setState要关闭?,dart,flutter,Dart,Flutter,接受一个函数,然后立即调用它,然后请求重建,有什么好处?特别是,与用户显式调用“rebuild”类型函数相比,有什么优势?当Flatter有一个“markNeedsBuild”函数时,开发人员最终只是随机调用它。当语法切换到setState((){…})时,开发人员更有可能正确使用API。从机器的角度来看,它们在功能上是等价的,但它们似乎唤起了开发人员的不同代码 如果您遵循只在setState闭包中变异成员变量的惯例,您将避免重构某些代码并意外删除对setState的调用,或者不必要地调用set
setState((){…})
时,开发人员更有可能正确使用API。从机器的角度来看,它们在功能上是等价的,但它们似乎唤起了开发人员的不同代码
如果您遵循只在setState
闭包中变异成员变量的惯例,您将避免重构某些代码并意外删除对setState
的调用,或者不必要地调用setState
。如果您的状态
已卸载,则flatter可能会使断言失败,这样您就可以在开始尝试变异成员时(而不是在最后)就知道出了问题
最终,可能会强制执行,即在对的成员进行变异时总是调用setState
,因此在initState
或setState
回调之外发生的任何成员变量变异都将被标记为可疑
如果您刚刚开始使用颤振中的状态,请查看。我发现很多我调用的代码<代码> SETStAs/COD>可以用更优雅的方式处理,或者,如果你发现自己调用了“代码> SETStest”,请不要忘记考虑那些备选方案。
Adam Barth和Yaroslav Volovich对此问题/答案做出了贡献。为了完成Colin的回答,它还确保您在处理异步函数时在正确的时刻调用
setState
在回调之外改变您的状态可能会导致一个简单的错误:
function() async {
setState(() {});
myState = await future;
}
这会导致一个问题,因为如果您的未来没有同步完成,则会在状态发生变化之前调用构建方法
通过使用回调,您必须执行以下操作:
function() async {
final value = await future;
setState(() {
myState = value;
});
}
这一次,它不会引起问题,因为在设置状态之前等待着未来
我不能进行异步回调,但仍然存在问题吗?
否。因为setState方法在内部检查回调是否不返回未来。如果它这样做了,它会扔
因此,以下是不可能的:
setState(() async {
myState = await future;
});