题目
StatefulWidget 的生命周期方法有哪些?
信息
- 类型:问答
- 难度:⭐
考点
StatefulWidget, 生命周期方法, Flutter框架
快速回答
StatefulWidget 的主要生命周期方法包括:
createState()- 创建关联的 State 对象initState()- 初始化状态(只调用一次)didChangeDependencies()- 依赖变化时调用build()- 构建UI(多次调用)didUpdateWidget()- 父组件重建时触发dispose()- 组件销毁时清理资源
原理说明
StatefulWidget 的生命周期由 Flutter 框架管理,当组件插入、更新或移除渲染树时,框架会自动调用相应方法。理解这些方法的调用时机对状态管理和资源清理至关重要。
生命周期方法详解(含代码示例)
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState(); // 1. 创建State对象
}
class _MyWidgetState extends State<MyWidget> {
int _counter = 0;
@override
void initState() {
super.initState();
print('initState: 初始化状态'); // 2. 初始化操作(如订阅事件)
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
print('didChangeDependencies: 依赖变化'); // 3. InheritedWidget更新时触发
}
@override
Widget build(BuildContext context) {
print('build: 构建UI'); // 4. 必须实现,返回Widget树
return Text('Count: $_counter');
}
@override
void didUpdateWidget(MyWidget oldWidget) {
super.didUpdateWidget(oldWidget);
print('didUpdateWidget: 组件更新'); // 5. 父组件重建时比较新旧配置
}
@override
void dispose() {
print('dispose: 资源清理'); // 6. 销毁前释放资源(如取消订阅)
super.dispose();
}
}调用顺序示意图
典型场景下的调用顺序:
创建组件 → initState → didChangeDependencies → build →(父组件更新)→ didUpdateWidget → build → 移除组件 → dispose
最佳实践
- 在
initState()中初始化依赖状态的数据 - 在
dispose()中必须释放资源(如 StreamSubscription) - 避免在
build()中进行耗时操作 - 使用
didUpdateWidget()响应父组件传递的新参数
常见错误
- 忘记调用
super.initState()或super.dispose() - 在
initState()中直接调用setState()(应通过初始化赋值) - 在 disposed 状态后调用
setState()(导致内存泄漏) - 在
build()中修改状态(引发无限循环)
扩展知识
- StatelessWidget:无状态组件只有
build()方法 - Key 的作用:当组件类型相同时,Key 帮助 Flutter 区分不同实例
- context:生命周期方法中可通过 context 获取父级 InheritedWidget(如 Theme)