Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 为什么setState要关闭?_Dart_Flutter - Fatal编程技术网

Dart 为什么setState要关闭?

Dart 为什么setState要关闭?,dart,flutter,Dart,Flutter,接受一个函数,然后立即调用它,然后请求重建,有什么好处?特别是,与用户显式调用“rebuild”类型函数相比,有什么优势?当Flatter有一个“markNeedsBuild”函数时,开发人员最终只是随机调用它。当语法切换到setState((){…})时,开发人员更有可能正确使用API。从机器的角度来看,它们在功能上是等价的,但它们似乎唤起了开发人员的不同代码 如果您遵循只在setState闭包中变异成员变量的惯例,您将避免重构某些代码并意外删除对setState的调用,或者不必要地调用set

接受一个函数,然后立即调用它,然后请求重建,有什么好处?特别是,与用户显式调用“rebuild”类型函数相比,有什么优势?

当Flatter有一个“markNeedsBuild”函数时,开发人员最终只是随机调用它。当语法切换到
setState((){…})
时,开发人员更有可能正确使用API。从机器的角度来看,它们在功能上是等价的,但它们似乎唤起了开发人员的不同代码

如果您遵循只在
setState
闭包中变异成员变量的惯例,您将避免重构某些代码并意外删除对
setState
的调用,或者不必要地调用
setState
。如果您的
状态
已卸载,则flatter可能会使断言失败,这样您就可以在开始尝试变异成员时(而不是在最后)就知道出了问题

最终,可能会强制执行,即在对的成员进行变异时总是调用
setState
,因此在
initState
setState
回调之外发生的任何成员变量变异都将被标记为可疑

如果您刚刚开始使用颤振中的状态,请查看。我发现很多我调用的代码<代码> SETStAs/COD>可以用更优雅的方式处理,或者,如果你发现自己调用了“代码> SETStest”,请不要忘记考虑那些备选方案。 Adam Barth和Yaroslav Volovich对这个问题/答案做出了贡献。

当Flatter有一个“markNeedsBuild”函数时,开发人员只是随意调用它。当语法切换到
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;
});

为了完成Colin的回答,它还确保您在处理异步函数时在正确的时刻调用
setState

在回调之外改变您的状态可能会导致一个简单的错误:

function() async {
  setState(() {});
  myState = await future;
}
这会导致一个问题,因为如果您的未来没有同步完成,则会在状态发生变化之前调用构建方法

通过使用回调,您必须执行以下操作:

function() async {
  final value = await future;
  setState(() {
    myState = value;
  });
}
这一次,它不会引起问题,因为在设置状态之前等待着未来

我不能进行异步回调,但仍然存在问题吗?

否。因为setState方法在内部检查回调是否不返回未来。如果它这样做了,它会扔

因此,以下是不可能的:

setState(() async {
  myState = await future;
});