鸿蒙跨端Flutter开发:生命周期管理
Flutter应用的生命周期分为引擎级、应用级、页面级三个层次,每个层次都有其特定的生命周期阶段。// 生命周期状态detached, // 应用分离inactive, // 应用不活跃paused, // 应用暂停hidden, // 应用隐藏resumed, // 应用恢复。
·

Flutter Embedding层的生命周期管理是保证应用稳定运行的关键。它需要协调Flutter引擎的生命周期与平台组件的生命周期。
一、生命周期概述
Flutter应用的生命周期分为引擎级、应用级、页面级三个层次,每个层次都有其特定的生命周期阶段。
// 生命周期状态
enum AppLifecycleState {
detached, // 应用分离
inactive, // 应用不活跃
paused, // 应用暂停
hidden, // 应用隐藏
resumed, // 应用恢复
}
生命周期层次
二、引擎生命周期
引擎生命周期是Flutter运行的最底层生命周期,管理Flutter引擎的创建、运行和销毁。
引擎生命周期状态
| 状态 | 说明 | 触发条件 |
|---|---|---|
| Initialized | 引擎已初始化 | 调用FlutterEngine构造函数 |
| Running | 引擎正在运行 | 调用run方法 |
| Paused | 引擎已暂停 | 应用进入后台 |
| Destroyed | 引擎已销毁 | 调用destroy方法 |
引擎生命周期示例
// 引擎生命周期管理
class EngineLifecycleManager {
FlutterEngine? _engine;
Future<void> initEngine() async {
// 初始化引擎
_engine = FlutterEngine();
await _engine!.initializeEngine();
print('引擎已初始化');
}
void startEngine() {
// 启动引擎
_engine?.run();
print('引擎已启动');
}
void pauseEngine() {
// 暂停引擎
_engine?.lifecycleController.pauseEngine();
print('引擎已暂停');
}
void resumeEngine() {
// 恢复引擎
_engine?.lifecycleController.resumeEngine();
print('引擎已恢复');
}
void destroyEngine() {
// 销毁引擎
_engine?.destroy();
_engine = null;
print('引擎已销毁');
}
}
三、应用生命周期
应用生命周期对应于平台的Activity/ViewController/Ability生命周期。
应用生命周期状态
| 状态 | Android | iOS | HarmonyOS | 说明 |
|---|---|---|---|---|
| created | onCreate | viewDidLoad | onCreate | 组件创建 |
| started | onStart | viewWillAppear | onForeground | 组件启动 |
| resumed | onResume | viewDidAppear | onActive | 组件活跃 |
| paused | onPause | viewWillDisappear | onInactive | 组件暂停 |
| stopped | onStop | viewDidDisappear | onBackground | 组件停止 |
| destroyed | onDestroy | dealloc | onDestroy | 组件销毁 |
应用生命周期监听
// 应用生命周期监听器
class AppLifecycleObserver extends StatefulWidget {
_AppLifecycleObserverState createState() => _AppLifecycleObserverState();
}
class _AppLifecycleObserverState extends State<AppLifecycleObserver>
with WidgetsBindingObserver {
AppLifecycleState? _lastLifecycleState;
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
void didChangeAppLifecycleState(AppLifecycleState state) {
setState(() {
_lastLifecycleState = state;
});
switch (state) {
case AppLifecycleState.resumed:
print('应用恢复');
_handleResumed();
break;
case AppLifecycleState.inactive:
print('应用不活跃');
_handleInactive();
break;
case AppLifecycleState.paused:
print('应用暂停');
_handlePaused();
break;
case AppLifecycleState.detached:
print('应用分离');
_handleDetached();
break;
case AppLifecycleState.hidden:
print('应用隐藏');
_handleHidden();
break;
}
}
void _handleResumed() {
// 恢复动画、定时器等
}
void _handleInactive() {
// 暂停不重要的操作
}
void _handlePaused() {
// 释放资源、保存状态
}
void _handleDetached() {
// 清理所有资源
}
void _handleHidden() {
// 处理隐藏状态
}
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
Widget build(BuildContext context) {
return Container(
child: Text('当前状态: $_lastLifecycleState'),
);
}
}
四、页面生命周期
页面生命周期对应于Flutter Widget的生命周期。
页面生命周期方法
| 方法 | 调用时机 | 用途 |
|---|---|---|
| createState | Widget首次插入树时 | 创建State对象 |
| initState | State对象创建后 | 初始化状态 |
| didChangeDependencies | 依赖变化时 | 更新依赖相关的状态 |
| build | 需要构建UI时 | 构建Widget树 |
| didUpdateWidget | 父Widget重建时 | 更新State |
| setState | 调用setState方法 | 标记需要重建 |
| deactivate | Widget从树中移除时 | 清理资源 |
| dispose | Widget永久销毁时 | 最终清理 |
页面生命周期示例
// 页面生命周期演示
class PageLifecycleDemo extends StatefulWidget {
_PageLifecycleDemoState createState() => _PageLifecycleDemoState();
}
class _PageLifecycleDemoState extends State<PageLifecycleDemo>
with RouteAware {
final List<String> _lifecycleLog = [];
void initState() {
super.initState();
_log('initState: 页面初始化');
}
void didChangeDependencies() {
super.didChangeDependencies();
_log('didChangeDependencies: 依赖变化');
}
void didUpdateWidget(PageLifecycleDemo oldWidget) {
super.didUpdateWidget(oldWidget);
_log('didUpdateWidget: Widget更新');
}
void deactivate() {
super.deactivate();
_log('deactivate: 页面停用');
}
void dispose() {
_log('dispose: 页面销毁');
super.dispose();
}
void _log(String message) {
setState(() {
_lifecycleLog.insert(0, '$message - ${DateTime.now().toString().substring(11, 19)}');
});
if (_lifecycleLog.length > 10) {
_lifecycleLog.removeLast();
}
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('页面生命周期')),
body: Column(
children: [
Expanded(
child: ListView.builder(
itemCount: _lifecycleLog.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(_lifecycleLog[index]),
);
},
),
),
ElevatedButton(
onPressed: () => setState(() {}),
child: const Text('触发重建'),
),
],
),
);
}
}
五、生命周期同步
Flutter引擎的生命周期需要与平台组件的生命周期保持同步。
同步机制
同步实现
// 生命周期同步器
class LifecycleSynchronizer {
final FlutterEngine _engine;
LifecycleSynchronizer(this._engine);
// 同步平台生命周期到Flutter引擎
void syncPlatformLifecycle(PlatformLifecycleState state) {
switch (state) {
case PlatformLifecycleState.created:
_onPlatformCreated();
break;
case PlatformLifecycleState.resumed:
_onPlatformResumed();
break;
case PlatformLifecycleState.paused:
_onPlatformPaused();
break;
case PlatformLifecycleState.destroyed:
_onPlatformDestroyed();
break;
}
}
void _onPlatformCreated() {
// 平台组件创建完成
_engine.lifecycleController.notifyCreated();
}
void _onPlatformResumed() {
// 平台组件恢复
_engine.lifecycleController.notifyResumed();
}
void _onPlatformPaused() {
// 平台组件暂停
_engine.lifecycleController.notifyPaused();
}
void _onPlatformDestroyed() {
// 平台组件销毁
_engine.lifecycleController.notifyDestroyed();
}
}
六、资源管理
生命周期管理中一个重要的方面是资源的合理分配和释放。
资源管理策略
| 资源类型 | 分配时机 | 释放时机 | 管理方式 |
|---|---|---|---|
| 动画控制器 | initState | dispose | AnimationController |
| 定时器 | 需要时 | dispose | Timer |
| 订阅 | initState | dispose | StreamSubscription |
| 文件句柄 | 需要时 | dispose | File |
| 网络连接 | 需要时 | dispose | HttpClient |
资源管理示例
// 资源管理器
class ResourceManager extends StatefulWidget {
_ResourceManagerState createState() => _ResourceManagerState();
}
class _ResourceManagerState extends State<ResourceManager>
with TickerProviderStateMixin {
late AnimationController _animationController;
Timer? _timer;
StreamSubscription? _subscription;
void initState() {
super.initState();
// 创建动画控制器
_animationController = AnimationController(
duration: const Duration(seconds: 2),
vsync: this,
)..repeat(reverse: true);
// 创建定时器
_timer = Timer.periodic(const Duration(seconds: 1), (timer) {
print('定时器触发');
});
// 创建订阅
_subscription = someStream.listen((data) {
print('收到数据: $data');
});
print('资源已分配');
}
void dispose() {
// 释放资源
_animationController.dispose();
_timer?.cancel();
_subscription?.cancel();
print('资源已释放');
super.dispose();
}
Widget build(BuildContext context) {
return Container(
child: AnimatedBuilder(
animation: _animationController,
builder: (context, child) {
return Container(
width: 100,
height: 100,
color: Color.fromRGBO(
255,
_animationController.value * 255,
0,
1.0,
),
);
},
),
);
}
}
七、生命周期最佳实践
合理管理生命周期可以避免内存泄漏和资源浪费。
最佳实践
- 及时释放资源:在dispose中释放所有资源
- 避免内存泄漏:不要在Widget外部持有State的引用
- 合理使用const:不变的Widget使用const减少重建
- 异步任务取消:在销毁时取消未完成的异步任务
内存泄漏检测
// 内存泄漏检测工具
class MemoryLeakDetector {
static final Map<String, WeakReference> _references = {};
static void track(String key, Object object) {
_references[key] = WeakReference(object);
}
static bool isAlive(String key) {
return _references[key]?.target != null;
}
static void cleanup() {
_references.clear();
}
}
八、HarmonyOS生命周期适配
HarmonyOS使用Ability组件,其生命周期与Android/iOS有所不同。
HarmonyOS Ability生命周期
| 状态 | 说明 | 对应Flutter状态 |
|---|---|---|
| onCreate | Ability创建 | created |
| onStart | Ability启动 | started |
| onActive | Ability激活 | resumed |
| onInactive | Ability失活 | inactive |
| onBackground | Ability后台 | paused |
| onForeground | Ability前台 | resumed |
| onStop | Ability停止 | stopped |
| onDestroy | Ability销毁 | destroyed |
HarmonyOS适配示例
// HarmonyOS生命周期适配
class HarmonyOSLifecycleAdapter {
void adaptAbilityLifecycle(AbilityLifecycle state) {
switch (state) {
case AbilityLifecycle.onCreate:
// 处理创建
break;
case AbilityLifecycle.onActive:
// 处理激活
break;
case AbilityLifecycle.onInactive:
// 处理失活
break;
case AbilityLifecycle.onBackground:
// 处理后台
break;
case AbilityLifecycle.onForeground:
// 处理前台
break;
case AbilityLifecycle.onStop:
// 处理停止
break;
case AbilityLifecycle.onDestroy:
// 处理销毁
break;
}
}
}
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
更多推荐


所有评论(0)