首页 > 解决方案 > 多少个 setState() 调用对于 Flutter 来说是多余的?

问题描述

我是 Flutter 的新手,响应式编程对我来说也是新事物。

假设我想用 Flutter 构建一个计时器。

我在其中添加了Scaffold所有必要的东西,并添加了一个IconButton启动StopwatchText显示经过时间的内容。我还添加Timer.periodic定期(每 0.5 秒)更新文本。

Text小部件通过检查是否Stopwatch正在运行并更新它的值来控制它自己的状态。

所以现在让我们说我想要更复杂的逻辑,根据其他按钮的一些操作来更改文本,这些按钮是Text. 但是,不能Text直接从同级小部件调用小部件的 setState。据我了解,反应范式的重点是状态可以沿树传递。但是,如果我创建我Scaffold的 asStatefulWidget并每 0.5 秒更新一次父级的状态,它将Scaffold用它的所有子级重新绘制我的整个状态。因此,最终当它Scaffold变得足够大时,它将不得不更新所有内容而不是单个Text小部件。

我对么?是否有任何解决方案。我读了一些关于 Streams 和 Sinks 的东西,但是它看起来很复杂,我认为应该有另一种解决方案。

标签: flutter

解决方案


您不需要重建整个树,如果状态仅在子小部件中更改,理想情况下您希望在该小部件中调用设置状态,以便只重建树的那部分(状态更改的部分)。

Streams 并没有那么复杂,它是您在应用程序的不同组件之间发送消息的好方法,这就是您在这里尝试做的事情。

在您的情况下,您还可以使用 aValueNotifier将状态存储在父小部件中,或者可能是 a AnimationController,并将其侦听器发送到需要在更改时更新的子小部件。

在任何情况下,状态都会被提升到父窗口小部件,然后子窗口小部件可以通过侦听器或流访问它。当侦听器触发信号时,您仅重建子小部件。


推荐阅读