Lifecycle
应用基础 · androidx.lifecycle
Lifecycle × Compose2.12.0-alpha01
collectAsStateWithLifecycle、LifecycleStartEffect/ResumeEffect、LocalLifecycleOwner 与 viewModel 的配合。
最后更新 2026-08-01
收集 UI 状态
@Composable
fun ProfileRoute(viewModel: ProfileViewModel = viewModel()) {
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
ProfileScreen(uiState)
}collectAsStateWithLifecycle 与 collectAsState 的区别:
| 函数 | 行为 | 适用 |
|---|---|---|
collectAsState | 永远收集,包括 UI 不可见时 | 快速原型 |
collectAsStateWithLifecycle | 低于 STARTED 停止收集,恢复时重启 | 正式代码 |
StateFlow重载直接用当前 value(无需 initialValue)。- 普通
Flow重载需要传initialValue。 - 默认 owner 来自
LocalLifecycleOwner;默认最低活跃状态STARTED。
带初始值的 Flow
val messages by viewModel.messageFlow.collectAsStateWithLifecycle(
initialValue = emptyList(),
)生命周期副作用:LifecycleStartEffect
需要成对持有资源(START/STOP 之间)时:
LifecycleStartEffect(tracker) {
val session = tracker.start()
onStopOrDispose { session.stop() }
}- 必须传 key:不带 key 的重载在源码中标为
DeprecationLevel.ERROR。key 定义 effect 身份;key 改变时旧资源先释放再建新的。 onStopOrDispose保证离开 STARTED 或组合销毁时释放。
LifecycleResumeEffect:RESUME/PAUSE 成对
LifecycleResumeEffect(Unit) {
val callback = object : OnPreDrawListener { ... }
view.addOnPreDrawListener(callback)
onPauseOrDispose { view.removeOnPreDrawListener(callback) }
}适合需要屏幕可见时才工作的场景(预绘制监听、传感器订阅)。
LifecycleEventEffect:单次事件
LifecycleEventEffect(Lifecycle.Event.ON_RESUME) {
analytics.onResume()
}只在指定事件触发时执行一次回调,不需要成对清理。
这些 API 的边界
- 生命周期副作用用
LifecycleStartEffect/LifecycleResumeEffect。 - 普通数据加载用
LaunchedEffect(与生命周期无关的协程)。 - 不要在
LifecycleEventEffect里做耗时操作(它不提供协程 scope)。
复制即用
import androidx.lifecycle.compose.LifecycleResumeEffect
import androidx.lifecycle.compose.LifecycleStartEffect
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel
@Composable
fun SensorScreen(
viewModel: SensorViewModel = viewModel(),
sensor: Sensor,
) {
val reading by viewModel.reading.collectAsStateWithLifecycle()
LifecycleStartEffect(sensor) {
val subscription = sensor.start()
onStopOrDispose { subscription.close() }
}
SensorDisplay(reading)
}常见陷阱
- collect 不停:
collectAsState()收集到组件销毁,collectAsStateWithLifecycle在不可见时暂停。 - effect key 错误:LifecycleStartEffect key 变则重启,key 要包含所有依赖。
- 用 LaunchedEffect 收集:数据收集优先用 Lifecycle 系 effect/collectAsStateWithLifecycle。
- RESUME/START 语义混淆:ResumeEffect 成对 RESUME/PAUSE,StartEffect 成对 START/STOP。
要点
collectAsStateWithLifecycle()是 Compose 收集 StateFlow 的标准方式(UI 不可见停止收集)。LifecycleStartEffect(key) { ... onStopOrDispose { } }成对持有/释放资源,key 必填。LifecycleResumeEffect/LifecycleEventEffect覆盖 RESUME 与单次事件场景。- 数据加载用
LaunchedEffect,生命周期副作用用 Lifecycle 系列 effect。