Flutter中的State是什么?Stateful Widget、setState及组件与应用状态有何区别?
1. 如何判断是否需要使用StatefulWidget
判断逻辑非常简单:只要组件的显示内容会在自身生命周期内发生自主变化,就用StatefulWidget,否则用StatelessWidget即可。
典型需要用StatefulWidget的场景:
- 计数器、开关、复选框、输入框等响应式交互控件,需要根据用户操作变更显示状态
- 异步请求数据的展示组件,需要在加载中、加载成功、加载失败三种状态间切换
- 包含自定义动画的组件,需要逐帧更新展示效果
- 随系统事件变化的组件,比如监听设备横竖屏切换后调整布局
如果组件仅渲染外部传入的固定参数,没有任何自主的显示变更逻辑,直接用StatelessWidget即可,不需要强行引入状态。
2. setState方法的作用
StatefulWidget的可变状态都存储在对应的State子类中,你直接修改State类内的变量,Flutter框架感知不到状态变更,也就不会触发UI更新。setState的核心作用就是主动通知Flutter框架:当前组件的状态已经变更,请使用最新的状态重新构建该组件。
执行setState后的流程:
- 执行你传入
setState回调内的状态变更逻辑 - Flutter将当前组件标记为「待重建」
- 在下一帧绘制周期到来时,调用
State的build方法,用新的状态生成新的Widget树 - 框架比对新旧Widget树的差异,只更新发生变化的UI部分,完成渲染
注意不要在setState回调中执行耗时操作或者嵌套调用setState,避免出现性能问题或者逻辑异常。
3. 组件局部状态与应用全局状态的区别
二者的核心差异是作用范围和使用场景:
- 作用范围不同:局部状态仅归单个
StatefulWidget所有,仅在该组件的生命周期内生效,其他组件无法直接访问,比如单个输入框的输入内容、单个列表项的展开/收起状态,这类不需要共享的状态直接作为State类的属性存储,用setState更新即可。 - 共享能力不同:全局状态是需要在应用内多个页面、多个组件间共享的状态,比如用户登录凭证、全局主题配色、购物车商品数据,这类数据如果存在单个组件的
State中,其他组件无法读取,因此需要统一放到全局状态容器中管理。 - 管理成本不同:局部状态无需引入任何第三方依赖,用原生
setState就能实现,逻辑最简单维护成本最低;全局状态通常需要借助Provider、Riverpod、Bloc等专门的状态管理方案,来实现跨组件的状态监听、变更通知、数据同步。
内容的提问来源于stack exchange,提问作者Abiy Menberu
相关产品推荐
相关产品推荐

