我是Flutter的新手,反应式编程对我来说也是新事物。
假设我想用Flutter建立一个计时器。
我添加了一个Scaffold
,其中包含所有必要的内容,然后我添加IconButton
,其中Stopwatch
和Text
显示已用时间。我还定期(每0.5秒)添加Timer.periodic
更新文本。
Text
Widget通过检查Stopwatch
是否正在运行并更新它的值来控制它自己的状态。
现在让我们说我想要更复杂的逻辑,根据Text
的兄弟姐妹的其他按钮的某些动作来改变文本。但是,无法直接从兄弟小部件调用Text
小部件的setState。据我所知,反应范式的关键是状态可以传递到树上。但是,如果我将Scaffold
设为StatefulWidget
并每隔0.5秒更新一次父级状态,则会重新绘制整个Scaffold
及其所有子项。因此,当Scaffold
变得足够大时,它将不得不更新所有内容而不是单个Text
小部件。
我说错了吗?这有什么解决方案吗?我读了一些关于Streams和Sinks的内容,但它看起来很复杂,我认为应该有另一个解决方案。
答案 0 :(得分:0)
提取窗口小部件并调用setState()窗体,窗口小部件不再渲染所有窗口小部件
答案 1 :(得分:0)
如果状态仅在子窗口小部件中更改,则不需要重建整个树,理想情况下,您希望在该窗口小部件中调用set state,以便只调用树的那部分(状态更改的那个)重建。
Streams并不是那么复杂,它是您在应用中不同组件之间发送消息的好方法,这是您在此尝试做的事情。
在您的情况下,您还可以使用ValueNotifier
在父窗口小部件中存储状态,或者使用AnimationController
,并将其侦听器发送到需要在更改时更新的子窗口小部件。 / p>
在任何情况下,状态都被提升到父窗口小部件,然后通过侦听器或流可以访问子窗口小部件。当侦听器触发信号时,只重建子小部件。