为什么在调用setState时需要添加回调函数,而不是直接调用没有回调函数的setState?

15

我仍然有点困惑这两者之间的区别

isBusy = false;
  setState(() {
});

setState(() {
  isBusy = true;
});
什么是它们之间的区别?我已经阅读了API,但不幸的是,我仍然不清楚它有什么区别。 我知道setState调用小部件的build方法。 API说明如下:每当更改State对象的内部状态时,都要在将函数传递给setState的函数中进行更改:setState((){_myState = newValue});提供的回调立即同步调用。这究竟意味着什么?有人可以给我一个超级简单的例子,说明这会有什么不同吗?
1个回答

15

使用 setState 的回调函数和不使用没有区别。

那有什么意义呢?

这是出于自愿为了防止处理异步数据时出现错误。

通过使用回调函数,有一种错误是您无法犯的:

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

这会导致一个问题,因为如果您的未来任务不同步完成,build方法将被调用并处于无效状态。

通过使用回调函数,您被强制执行以下操作:

function() async {
  final value = await future;
  setState(() {
    myState = value;
  });
}

这一次,在调用setState之前等待future的到来不会造成问题。

如果我使用异步回调,还会有这个问题吗?

不会。 因为setState方法内部会检查回调函数是否返回future。如果返回了future,它会抛出异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接