Lifecycle × Compose · AndroidX 源码指南
AAndroidX 源码指南
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)
}

collectAsStateWithLifecyclecollectAsState 的区别

函数行为适用
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。

相关页面