以下是这些 Compose API 的总结
API 名称 | 作用 | 典型使用场景 | 注意事项 |
---|---|---|---|
LaunchedEffect | 在 Composable 中启动协程任务,协程生命周期与组件绑定。 | 一次性异步操作(如网络请求、动画)、响应 key 变化重启任务。 | key 参数变化时会取消旧协程并启动新协程。 |
rememberCoroutineScope | 获取与当前组件绑定的协程作用域,手动控制协程启动时机。 | 用户交互触发的异步任务(如点击按钮发起请求)。 | 协程作用域在组件退出时自动取消所有子协程。 |
rememberUpdatedState | 在重组中保持状态的最新值,避免闭包捕获旧值。 | 长时间任务中访问最新状态(如延迟回调、动画)。 | 通常与 LaunchedEffect 或协程结合使用。 |
DisposableEffect | 执行需要清理的副作用操作(如注册监听器),组件退出时自动清理。 | 注册/反注册监听、申请/释放资源(传感器、广播、文件句柄)。 | 必须返回 onDispose { ... } 。 |
SideEffect | 在重组后执行与 UI 无关的副作用(如修改全局状态)。 | 更新 Activity 标题、同步非 Compose 状态(全局变量、第三方库)。 | 无生命周期绑定,仅在组件存在时执行。 |
produceState | 将异步数据流转换为 Compose 状态,自动管理协程。 | 网络请求、监听数据库/Flow、传感器数据流。 | 返回 State<T> ,依赖 key 变化重启任务。 |
derivedStateOf | 派生新状态,仅在依赖项变化时重新计算(性能优化)。 | 高频状态计算的缓存(如滚动位置判断、表单验证)。 | 用 remember 包裹,避免每次重组重新创建。 |
snapshotFlow | 将 Compose 状态转换为 Flow,响应状态变化发射数据。 | 将状态变化桥接到 Flow 处理(如防抖、批量操作)。 | 需在协程中收集(如 LaunchedEffect 或 collectAsState )。 |
关键对比
-
异步任务管理:
LaunchedEffect
:自动启动协程,适合一次性任务。rememberCoroutineScope
:手动控制协程启动时机。produceState
:将异步数据流绑定为状态。
-
副作用生命周期:
DisposableEffect
:需要清理的操作(如注册监听)。SideEffect
:无需清理的简单操作(如修改标题)。
-
状态派生与优化:
derivedStateOf
:减少高频状态计算。snapshotFlow
:将状态桥接到 Flow 处理流式逻辑。
-
状态保鲜:
rememberUpdatedState
:确保闭包中访问最新值。
使用口诀
- 要启动协程任务 →
LaunchedEffect
(自动) /rememberCoroutineScope
(手动) - 要绑定资源生命周期 →
DisposableEffect
- 要同步外部状态 →
SideEffect
- 要异步转同步状态 →
produceState
- 要优化高频计算 →
derivedStateOf
- 要状态转流处理 →
snapshotFlow
- 要保鲜闭包状态 →
rememberUpdatedState