Flutter State的dirty属性何时变更?构建阶段何时转为false?
Flutter中State的dirty属性何时被设为false?
直接答案
State的_dirty属性会在组件完成构建流程后,由Flutter框架的performRebuild方法将其重置为false,具体节点是在build方法执行完毕之后。
详细说明
- 当调用
setState()时,内部会触发markNeedsBuild(),该方法会先检查_dirty状态:如果已经是true则直接返回;如果是false,会将_dirty设为true,并通知框架调度该组件的构建任务。你提到的代码片段也验证了这一点:
if (dirty) { return; } _dirty = true; owner!.scheduleBuildFor(this);
当框架开始处理该组件的构建任务时,会调用
performRebuild()方法。这个方法的执行流程是:先调用组件的build方法完成UI构建,无论构建过程中是否修改了状态,都会在构建完成后执行_dirty = false,将标记重置为未脏状态。这就解释了为什么在
build期间_dirty始终为true——此时组件正处于构建流程中,标记还未被重置,所以此时调用setState()会因为markNeedsBuild()的判断逻辑而无法生效,这也和官方文档的提示一致:
由于在一帧内构建两次元素效率低下,应用和组件应确保仅在帧开始前的事件处理程序中标记组件为脏,而非在构建过程中。
内容的提问来源于stack exchange,提问作者Egor Grischenkov
相关产品推荐
相关产品推荐

