Flutter中State类内与build方法内声明的变量有什么区别?
Flutter State类两类变量的区别和适用场景
首先给出示例代码:
class StatefulWidget_STATE_class extends State<className>{ // 类成员变量 final int variable_1 = 2; @override Widget build(BuildContext context){ // build方法内局部变量 final int variable_2 = 2; return Container(); } }
核心区别
- 生命周期不同
variable_1是State类的成员变量,和State实例的生命周期完全绑定:State初始化时仅赋值一次,只要State未被销毁,变量就会一直存在,多次触发build重绘也不会重新初始化。variable_2是build方法的局部变量,每次build执行时都会重新创建赋值,build执行结束后就会被垃圾回收。 - 访问范围不同
variable_1可以在State类的所有方法中访问,包括initState、dispose、自定义业务方法、build方法等。variable_2只能在当前build方法内部访问,其他方法无法读取。 - 性能开销不同
variable_1仅初始化一次,即便是复杂对象也不会产生重复创建的开销。variable_2每次build都会重新生成,如果是创建成本高的复杂对象、或者页面build触发非常频繁,会产生不必要的性能消耗。
适用场景
类成员变量(variable_1形式)适用场景
- 变量需要在多个生命周期方法、自定义业务方法中访问
- 变量是创建成本高的复杂对象,比如动画控制器、正则实例、大量数据的列表等
- 变量是需要持久存储的状态值,比如计数器数值、开关状态、用户输入缓存等,需要在多次build之间保留值
- 变量是不依赖上下文的固定常量,可以加
static const进一步优化性能
build内部局部变量(variable_2形式)适用场景
- 变量仅在本次build中使用,其他业务逻辑不需要访问
- 变量的值依赖当前build的上下文动态生成,比如从
Theme.of(context)、MediaQuery.of(context)、父组件传递的props中衍生的值,下次build时可能发生变化 - 变量是轻量的简单值,创建几乎没有额外开销
注意:如果是依赖上下文的动态值,且需要在多个地方复用,可以考虑用扩展方法、或者封装独立组件的方式减少重复计算,避免不必要的性能损耗。
内容的提问来源于stack exchange,提问作者Aryan Sethi
相关产品推荐
相关产品推荐

