一、StatefulWidget 生命周期这是 Flutter 中最常用、最重要的生命周期每个StatefulWidget都有完整的生命周期流程。1. 生命周期流程图2. 生命周期方法class MyWidget extends StatefulWidget { override _MyWidgetState createState() _MyWidgetState(); } class _MyWidgetState extends StateMyWidget { // 1. 构造函数不是生命周期方法但最先执行 _MyWidgetState() { print(1. 构造函数执行); } // 2. initState - 状态初始化 override void initState() { super.initState(); print(2. initState - 只执行一次); // 初始化数据、监听器、Stream、动画控制器等 // 注意不能在这里调用 BuildContext 的依赖方法 } // 3. didChangeDependencies - 依赖变化时调用 override void didChangeDependencies() { super.didChangeDependencies(); print(3. didChangeDependencies - 依赖的 InheritedWidget 变化时调用); // 在 initState 之后立即调用之后每次依赖变化都会调用 } // 4. build - 构建 UI override Widget build(BuildContext context) { print(4. build - UI 构建); return Container( child: Text(Hello), ); } // 5. didUpdateWidget - Widget 配置更新时调用 override void didUpdateWidget(covariant MyWidget oldWidget) { super.didUpdateWidget(oldWidget); print(5. didUpdateWidget - Widget 重建且配置变化时调用); // 当父 Widget 重建并传递了新参数时调用 } // 6. setState - 触发重建不是生命周期方法但常用 void updateData() { setState(() { print(6. setState - 触发 UI 重建); // 更新状态 }); } // 7. deactivate - 从树中移除时调用 override void deactivate() { super.deactivate(); print(7. deactivate - State 从树中移除); // 当 Widget 被移除如路由返回时调用 } // 8. dispose - 永久销毁 override void dispose() { print(8. dispose - 永久销毁释放资源); // 取消监听器、销毁动画控制器、关闭 Stream 等 super.dispose(); } // 9. reassemble - 热重载时调用仅开发环境 override void reassemble() { super.reassemble(); print(9. reassemble - 热重载时调用); } }二、App 生命周期WidgetsBindingObserver通过WidgetsBindingObserver可以监听应用的前后台切换、系统弹窗等。1. 监听应用状态class AppLifecycleDemo extends StatefulWidget { override _AppLifecycleDemoState createState() _AppLifecycleDemoState(); } class _AppLifecycleDemoState extends StateAppLifecycleDemo with WidgetsBindingObserver { AppLifecycleState? _appLifecycleState; override void initState() { super.initState(); // 添加观察者 WidgetsBinding.instance.addObserver(this); } override void dispose() { // 移除观察者 WidgetsBinding.instance.removeObserver(this); super.dispose(); } override void didChangeAppLifecycleState(AppLifecycleState state) { setState(() { _appLifecycleState state; }); switch (state) { case AppLifecycleState.resumed: print(应用回到前台); break; case AppLifecycleState.inactive: print(应用处于非活动状态如接电话); break; case AppLifecycleState.paused: print(应用进入后台); break; case AppLifecycleState.detached: print(应用即将被销毁); break; case AppLifecycleState.hidden: print(应用隐藏iOS 特有); break; } } override Widget build(BuildContext context) { return Scaffold( body: Center( child: Text(App 状态: $_appLifecycleState), ), ); } }三、路由生命周期1. RouteObserver 监听路由变化// 创建 RouteObserver final RouteObserverPageRoute routeObserver RouteObserverPageRoute(); // 在 MaterialApp 中注册 class MyApp extends StatelessWidget { override Widget build(BuildContext context) { return MaterialApp( navigatorObservers: [routeObserver], // 注册观察者 home: HomePage(), ); } } // 使用 RouteAware 监听页面生命周期 class MyPage extends StatefulWidget { override _MyPageState createState() _MyPageState(); } class _MyPageState extends StateMyPage with RouteAware { override void didChangeDependencies() { super.didChangeDependencies(); // 订阅路由观察者 routeObserver.subscribe(this, ModalRoute.of(context) as PageRoute); } override void dispose() { // 取消订阅 routeObserver.unsubscribe(this); super.dispose(); } // 页面被推入时调用 override void didPush() { print(页面被推入); } // 页面被弹出时调用 override void didPop() { print(页面被弹出); } // 页面被新的页面覆盖时调用 override void didPushNext() { print(有新页面推入当前页面被覆盖); } // 覆盖当前页面的页面被弹出时调用 override void didPopNext() { print(上面的页面被弹出当前页面重新显示); } override Widget build(BuildContext context) { return Scaffold( body: Center(child: Text(路由生命周期示例)), ); } }2. 使用 Navigator 观察者class MyNavigatorObserver extends NavigatorObserver { override void didPush(Routedynamic route, Routedynamic? previousRoute) { print(推入路由: ${route.settings.name}); } override void didPop(Routedynamic route, Routedynamic? previousRoute) { print(弹出路由: ${route.settings.name}); } override void didRemove(Routedynamic route, Routedynamic? previousRoute) { print(移除路由: ${route.settings.name}); } override void didReplace({Routedynamic? newRoute, Routedynamic? oldRoute}) { print(替换路由: ${oldRoute?.settings.name} - ${newRoute?.settings.name}); } } // 使用 MaterialApp( navigatorObservers: [MyNavigatorObserver()], // ... )四、KeepAlive 生命周期AutomaticKeepAliveClientMixin用于保持页面状态如 Tab 页切换时保持页面不被销毁。class KeepAlivePage extends StatefulWidget { override _KeepAlivePageState createState() _KeepAlivePageState(); } class _KeepAlivePageState extends StateKeepAlivePage with AutomaticKeepAliveClientMixin { int _counter 0; override bool get wantKeepAlive true; // 保持页面状态 override Widget build(BuildContext context) { // 必须调用 super.build super.build(context); return Scaffold( body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text(计数: $_counter), ElevatedButton( onPressed: () { setState(() { _counter; }); }, child: Text(增加), ), ], ), ), ); } }五、生命周期汇总生命周期调用时机主要用途createStateState 对象创建时创建 State 实例initStateWidget 插入树后初始化数据、监听器、动画didChangeDependencies依赖变化时处理 InheritedWidget 变化build每次重建时构建 UIdidUpdateWidgetWidget 配置变化时响应父 Widget 参数变化setState手动调用时触发 UI 重建deactivateState 从树移除时临时移除前的清理disposeState 永久销毁时释放资源、取消订阅didChangeAppLifecycleState应用前后台切换暂停/恢复资源didPush/didPop路由变化时页面埋点、状态管理备注在dispose中释放所有资源定时器、Stream、动画控制器。使用mounted检查 State 是否还在树中避免在dispose后调用setState。利用WidgetsBindingObserver监听应用状态优化资源使用。使用RouteObserver追踪页面访问便于埋点和分析。