flutter - 多少个 setState() 调用对于 Flutter 来说是多余的?
问题描述
我是 Flutter 的新手,响应式编程对我来说也是新事物。
假设我想用 Flutter 构建一个计时器。
我在其中添加了Scaffold
所有必要的东西,并添加了一个IconButton
启动Stopwatch
和Text
显示经过时间的内容。我还添加Timer.periodic
定期(每 0.5 秒)更新文本。
Text
小部件通过检查是否Stopwatch
正在运行并更新它的值来控制它自己的状态。
所以现在让我们说我想要更复杂的逻辑,根据其他按钮的一些操作来更改文本,这些按钮是Text
. 但是,不能Text
直接从同级小部件调用小部件的 setState。据我了解,反应范式的重点是状态可以沿树传递。但是,如果我创建我Scaffold
的 asStatefulWidget
并每 0.5 秒更新一次父级的状态,它将Scaffold
用它的所有子级重新绘制我的整个状态。因此,最终当它Scaffold
变得足够大时,它将不得不更新所有内容而不是单个Text
小部件。
我对么?是否有任何解决方案。我读了一些关于 Streams 和 Sinks 的东西,但是它看起来很复杂,我认为应该有另一种解决方案。
解决方案
您不需要重建整个树,如果状态仅在子小部件中更改,理想情况下您希望在该小部件中调用设置状态,以便只重建树的那部分(状态更改的部分)。
Streams 并没有那么复杂,它是您在应用程序的不同组件之间发送消息的好方法,这就是您在这里尝试做的事情。
在您的情况下,您还可以使用 aValueNotifier
将状态存储在父小部件中,或者可能是 a AnimationController
,并将其侦听器发送到需要在更改时更新的子小部件。
在任何情况下,状态都会被提升到父窗口小部件,然后子窗口小部件可以通过侦听器或流访问它。当侦听器触发信号时,您仅重建子小部件。
推荐阅读
- javascript - 如果我在 Javascript 中创建一个类的多个实例,每个实例的每个函数是否像变量一样在内存中获得自己的空间?
- tensorflow - TPU 训练错误:“没有为与节点 {{node RaggedConcat/Cumsum 兼容的 XLA_TPU_JIT 设备注册的 'Cumsum' OpKernel”
- python - 函数帮助 - Python Pandas
- python - 在python中着色和标记散点图点时如何设置阈值
- javascript - 未捕获的类型错误:firebase.firestore 不是函数
- javascript - discord.js 使消息作者异常
- javascript - 单击删除时 Javascript 取消链接
- makefile - 如何让 GNU make 批量运行?
- python - (再次)如何只翻译 DRF 中的自定义错误消息?
- python-3.x - 导入python模块的运行时错误