Flutter有多少setState()调用是否过度?

时间:2018-06-07 10:25:50

标签: flutter

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

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

我添加了一个Scaffold,其中包含所有必要的内容,然后我添加IconButton,其中StopwatchText显示已用时间。我还定期(每0.5秒)添加Timer.periodic更新文本。

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

现在让我们说我想要更复杂的逻辑,根据Text的兄弟姐妹的其他按钮的某些动作来改变文本。但是,无法直接从兄弟小部件调用Text小部件的setState。据我所知,反应范式的关键是状态可以传递到树上。但是,如果我将Scaffold设为StatefulWidget并每隔0.5秒更新一次父级状态,则会重新绘制整个Scaffold及其所有子项。因此,当Scaffold变得足够大时,它将不得不更新所有内容而不是单个Text小部件。

我说错了吗?这有什么解决方案吗?我读了一些关于Streams和Sinks的内容,但它看起来很复杂,我认为应该有另一个解决方案。

2 个答案:

答案 0 :(得分:0)

提取窗口小部件并调用setState()窗体,窗口小部件不再渲染所有窗口小部件

答案 1 :(得分:0)

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

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

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

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