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
解释 Streams 和 Reactive 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 重建整页功能的主要内容,如果未能解决你的问题,请参考以下文章
Flutter - setState 不更新内部有状态小部件