【问题标题】:How many setState() calls is overkill for Flutter?多少个 setState() 调用对于 Flutter 来说是多余的?
【发布时间】:2018-11-17 05:33:48
【问题描述】:

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

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

我添加了一个Scaffold,其中包含所有必要的东西,我添加了一个IconButton,它启动了Stopwatch和Text,它显示了经过的时间。我还添加了Timer.periodic 以定期(每 0.5 秒)更新文本。

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

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

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

【问题讨论】:

标签: flutter


【解决方案1】:

提取小部件并从该小部件调用 setState() 并且它不会再次呈现所有小部件

【讨论】:

  • 错了。它会。当任何给定的小部件发生变化时,Flutter 会重新绘制整个树
  • 我确定 setState() 只调用该小部件的构建方法
  • 对于构建,是的。但重绘没有。如果有任何小部件 build,则所有小部件 paint
  • @RémiRousselet 好的,所以使用流可以避免这种情况??
  • 不,不能。 Steam 只是调用 setState 的另一种方式。但是你最后还是调用了 setState。
【解决方案2】:

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

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

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

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

【讨论】:

  • 这不重要。杀死性能的是重绘。 Whis 使用 repaintboundary 解决
  • 取决于您的用例。 RepaintBoundary 值得研究,但我会更担心不必要的重建,这也是问题所在。甚至整个屏幕的绘制成本也不高,并且与更多的重绘组相关联的额外构图成本。
  • 我认为这个问题太宽泛了。
猜你喜欢
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
相关资源
最近更新 更多