Flutter setState 重建整页功能

Posted

技术标签:

【中文标题】Flutter setState 重建整页功能【英文标题】:Flutter setState rebuilding whole page efficacy 【发布时间】:2019-07-03 16:11:48 【问题描述】:

我想知道setState() 在 Flutter 中是如何工作的。

我有一个包含 ListView 和播放按钮的页面。当我按下按钮时,我调用setState() 来更改按钮的图标。这会触发 ListView 重建它的项目的整个列表。

我是否应该将我的按钮包装在一个新的 StatefulWidget 中,这样重建按钮不会重建整个页面?或者 Flutter 是否足够聪明,可以找出真正发生的变化并只重建这些小部件?如果信是这样,它是如何工作的?我确定我的 List 项的 build 方法正在被调用...

【问题讨论】:

【参考方案1】:

您应该了解更多关于 Flutter 中的响应式编程Streams响应式编程是围绕Streams和监听器概念的架构。 Streams 只允许你重建一个特定的元素,效率更高!

来自 Google I/O '18 的视频:

https://www.youtube.com/watch?v=RS36gBEp8OI

解释 StreamsReactive Programming 概念的精彩帖子:

https://www.didierboelens.com/2018/08/reactive-programming---streams---bloc/

是中等难度的方法,但值得学习!

祝你好运!

【讨论】:

谢谢,但我知道反应式编程。但是你推荐什么。您是否建议我为按钮图标和 StreamBuilder 使用 Stream 以便在按下按钮时不需要调用 setState ?我知道我可以这样做,但我的主要问题是如果我真的需要这样做,或者颤振知道需要重建什么...... @Jonas 当你调用setState 时,它会调用这个StatefulWidget 的rebuild 方法,它被调用的地方。所以现在你可以选择,你会打电话给setState。如果您在绘制整个窗口的Widget 中调用它,那么它将重建所有窗口。如果你自定义Button(StatefulWidget),并在这个Button中调用setState,那么只会重建Button。但是在最后一个选项中,您正在组合业务逻辑和显示图形 - 它不是那么好。所以你必须使用 Streams 并且不要使用setState,如果你想以良好和有效的方式重建特定元素:) 好吧,我想我前段时间读到过,flutter 足够聪明,可以弄清楚哪些发生了变化,哪些应该重建,哪些不应该重建。如果不是这样,我需要确定应该手动重建什么,不应该手动重建什么。

以上是关于Flutter setState 重建整页功能的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 setState 在颤振中重建

Flutter:setState() 中的代码是不是重要?

Flutter - setState不使用新数据

Flutter - setState 不更新内部有状态小部件

setState 是不是会在颤动中为屏幕重建整个小部件树,以及它与其他状态管理相比如何

Flutter 在 ListView 中仅重建一行