Flutter如何处理Android与iOS应用生命周期?是否有类似原生的生命周期方法?
Hey there! Great question—handling lifecycle events is crucial for building robust Flutter apps, especially when you need to align with Android and iOS native behaviors. Let me break this down into two key parts: app-wide lifecycle and screen/widget-level lifecycle (which maps to your native Activity/ViewController methods).
一、监听应用全局生命周期
Flutter provides a unified way to track app-level lifecycle changes that correspond to both Android's app states and iOS's UIApplication states. You'll use WidgetsBindingObserver for this.
Step 1: 实现WidgetsBindingObserver
Add the observer to your widget state, then override the didChangeAppLifecycleState method to react to state changes:
import 'package:flutter/material.dart'; class LifecycleDemo extends StatefulWidget { const LifecycleDemo({super.key}); @override State<LifecycleDemo> createState() => _LifecycleDemoState(); } class _LifecycleDemoState extends State<LifecycleDemo> with WidgetsBindingObserver { @override void initState() { super.initState(); // 注册观察者 WidgetsBinding.instance.addObserver(this); } @override void didChangeAppLifecycleState(AppLifecycleState state) { super.didChangeAppLifecycleState(state); // 根据不同状态执行逻辑 switch (state) { case AppLifecycleState.resumed: // 应用回到前台,对应Android的onResume、iOS的applicationDidBecomeActive print("App is resumed"); break; case AppLifecycleState.inactive: // 应用处于非活跃状态(比如来电、下拉通知栏),对应Android的onPause、iOS的applicationWillResignActive print("App is inactive"); break; case AppLifecycleState.paused: // 应用进入后台,对应Android的onStop、iOS的applicationDidEnterBackground print("App is paused"); break; case AppLifecycleState.detached: // 应用即将被销毁,对应Android的onDestroy、iOS的applicationWillTerminate print("App is detached"); break; case AppLifecycleState.hidden: // iOS特有:应用完全隐藏(比如切换到多任务界面) print("App is hidden"); break; } } @override void dispose() { // 移除观察者,避免内存泄漏 WidgetsBinding.instance.removeObserver(this); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text("Lifecycle Demo")), body: const Center(child: Text("Check console for lifecycle events")), ); } }
对应原生状态映射
| Flutter AppLifecycleState | Android 状态 | iOS 状态 |
|---|---|---|
| resumed | onResume | applicationDidBecomeActive |
| inactive | onPause | applicationWillResignActive |
| paused | onStop | applicationDidEnterBackground |
| detached | onDestroy | applicationWillTerminate |
| hidden | - | applicationDidEnterBackground (完全隐藏场景) |
二、Widget/Screen级生命周期(对应Activity/ViewController方法)
For individual screens or stateful widgets, Flutter has its own lifecycle methods that align closely with Android's Activity and iOS's ViewController lifecycle hooks.
StatefulWidget 核心生命周期方法
These are the equivalent of native lifecycle callbacks for a single widget/screen:
initState(): 类似Android的onCreate()、iOS的viewDidLoad()。在widget第一次创建时调用,只执行一次,适合初始化数据、订阅流等。didChangeDependencies(): 当widget依赖的InheritedWidget变化时调用,也会在initState()之后立即执行。可以在这里处理依赖变化后的逻辑。build(): 每次widget需要重建时调用,用来构建UI。类似Android的onDraw()或iOS的viewWillLayoutSubviews,但更频繁。didUpdateWidget(Widget oldWidget): 当widget的配置(比如构造参数)变化时调用,可以在这里对比新旧widget的差异并更新状态。dispose(): 类似Android的onDestroy()、iOS的dealloc/viewWillDisappear(最终销毁时)。在widget被移除时调用,用来清理资源(取消订阅、关闭流、释放内存)。
路由级生命周期监听(类似viewWillAppear/viewWillDisappear)
If you need to track when a screen is pushed/popped (like iOS's viewWillAppear/viewWillDisappear), use RouteObserver:
Step 1: 初始化RouteObserver
在MaterialApp中注册:
final RouteObserver<PageRoute> routeObserver = RouteObserver<PageRoute>(); void main() { runApp(MaterialApp( home: const HomeScreen(), navigatorObservers: [routeObserver], // 添加路由观察者 )); }
Step 2: 在目标页面监听路由事件
class DetailScreen extends StatefulWidget { const DetailScreen({super.key}); @override State<DetailScreen> createState() => _DetailScreenState(); } class _DetailScreenState extends State<DetailScreen> with RouteAware { @override void didChangeDependencies() { super.didChangeDependencies(); // 订阅路由观察者 routeObserver.subscribe(this, ModalRoute.of(context) as PageRoute); } @override void didPush() { // 页面被推入栈,类似iOS的viewWillAppear、Android的onResume(页面首次显示) print("Detail screen pushed"); } @override void didPopNext() { // 从下一个页面返回当前页面,类似iOS的viewWillAppear、Android的onResume(返回时) print("Back to detail screen"); } @override void didPop() { // 当前页面被弹出栈,类似iOS的viewWillDisappear、Android的onPause(页面销毁前) print("Detail screen popped"); } @override void dispose() { // 取消订阅 routeObserver.unsubscribe(this); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text("Detail Screen")), ); } }
总结
- 应用全局生命周期用
WidgetsBindingObserver监听AppLifecycleState,统一适配Android和iOS的后台/前台状态。 - Widget级生命周期用StatefulWidget的
initState()/dispose()等方法,对应原生的创建/销毁逻辑。 - 路由级显示/隐藏事件用
RouteObserver,对应iOS的viewWillAppear/viewWillDisappear和Android的页面切换状态。
内容的提问来源于stack exchange,提问作者Deepak Ror

