应用生命周期组件

应用生命周期组件用于监听和处理应用的各种状态变化。

提示:理解应用生命周期对于创建响应式的应用非常重要。
生命周期状态示意图
resumed
应用活跃中
inactive
非活动状态
paused
应用暂停
detached
即将销毁

AppLifecycleState

AppLifecycleState 定义了应用的不同生命周期状态。

enum AppLifecycleState {
  resumed,      // 应用可见且响应用户输入
  inactive,     // 应用处于非活动状态(如来电、通知)
  paused,       // 应用不可见且不响应用户输入
  detached,     // 应用即将被销毁
  hidden,       // 应用处于后台
}

WidgetsBindingObserver

WidgetsBindingObserver 是一个观察者接口,用于监听系统事件。

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State
    with WidgetsBindingObserver {
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    print('应用状态变化: $state');
    // 根据状态执行相应操作
  }
}
生命周期切换示例
paused
resumed
应用恢复到前台
resumed
inactive
来电或通知
inactive
paused
按Home键

didChangeAppLifecycleState

didChangeAppLifecycleState 在应用生命周期状态改变时被调用。

@override
void didChangeAppLifecycleState(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('应用隐藏');
      break;
  }
}

resumed

应用可见且响应用户输入时的状态。

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
  if (state == AppLifecycleState.resumed) {
    // 恢复视频播放
    videoController.play();
    // 重新连接 WebSocket
    reconnectWebSocket();
    // 刷新数据
    refreshData();
  }
}
resumed 状态应用行为
当前状态: resumed
应用可见且响应输入
执行的操作:
✓ 恢复视频播放
✓ 重新连接 WebSocket
✓ 刷新数据
paused 状态应用行为
当前状态: paused
应用不可见,不响应输入
执行的操作:
⏸ 暂停视频播放
📡 断开网络连接
💾 保存当前状态

paused

应用不可见且不响应用户输入时的状态。

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
  if (state == AppLifecycleState.paused) {
    // 暂停视频播放
    videoController.pause();
    // 断开网络连接
    disconnectWebSocket();
    // 保存当前状态
    saveAppState();
  }
}
detached 状态应用行为
当前状态: detached
应用即将被销毁
执行的操作:
🗑 释放视频控制器
🗑 释放音频控制器
⏰ 取消所有定时器
💾 保存最终状态

detached

应用即将被销毁时的状态。

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
  if (state == AppLifecycleState.detached) {
    // 释放所有资源
    videoController.dispose();
    audioController.dispose();
    // 取消所有定时器
    cancelAllTimers();
    // 保存最终状态
    saveFinalState();
  }
}
生命周期最佳实践:
  • 在 initState 中注册观察者
  • 在 dispose 中移除观察者
  • 在 paused 时保存数据
  • 在 resumed 时恢复操作
  • 在 detached 时清理资源
注意事项:
  • Web 平台的生命周期可能有所不同
  • 测试时需要模拟不同的生命周期状态
  • 某些操作在不同平台上的行为可能不同