Compose生命周期---Lifecycle of composables

在 Jetpack Compose 中,生命周期与传统 View 系统 (Activity / Fragment) 的生命周期大不相同。Compose 是声明式的 UI 框架,UI 是由状态驱动生成的,其生命周期依赖于「组合(Composition)」和「重组(Recomposition)」过程,以及副作用(Side Effects)的控制。

一、Compose 的生命周期结构

阶段 含义 类比传统Android生命周期
Composition(组合) 第一次调用 @Composable 构建 UI onCreate() / onStart()
Recomposition(重组) 状态变化时,自动刷新相关 UI 部分 onResume()(多次执行)
Disposal(释放) UI 不再需要,Compose 会清理资源 onPause() / onDestroy()

二、生命周期相关的 Compose 函数(副作用 API)

副作用函数是 Compose 提供的"生命周期钩子",可安全地进行如网络请求、监听器注册、清理任务等。

✅ 1. LaunchedEffect 组件进入组合或 key 变化时执行协程代码(只执行一次或条件变化时重新执行)

kotlin 复制代码
@Composable
fun MyScreen(userId: String) {
    LaunchedEffect(userId) {
        // 初始加载或 userId 改变时触发
        val userData = loadUser(userId)
        println("Loaded user: $userData")
    }
}

支持 CoroutineScope,适合做网络请求、动画、延迟等

常用于:页面加载、初始化数据

✅ 2. DisposableEffect

组件进入组合时初始化,在离开组合时释放资源

kotlin 复制代码
@Composable
fun LifecycleAwareComponent(someKey: String) {
    DisposableEffect(someKey) {
        println("Component active with key: $someKey")

        onDispose {
            println("Component with key $someKey is disposed")
        }
    }
}

常用于:注册广播、监听器、传感器等资源释放相关场景

✅ 3. SideEffect

每次重组后立即执行,适合和外部系统同步状态

kotlin 复制代码
@Composable
fun MyComponent(count: Int) {
    SideEffect {
        println("Current count is $count")
    }
}

✅ 4. rememberUpdatedState

用于保证 LaunchedEffect 或 DisposableEffect 中使用到的 lambda 是最新的版本

kotlin 复制代码
@Composable
fun TimerEffect(onTick: () -> Unit) {
    val currentOnTick by rememberUpdatedState(onTick)

    LaunchedEffect(Unit) {
        while (true) {
            delay(1000)
            currentOnTick()  // always calls the latest lambda
        }
    }
}

解决"捕获旧 lambda"的问题

🎯 三、搭配 LifecycleOwner 使用(配合 ViewModel)

在某些场景中,我们需要访问宿主组件(如 Activity/Fragment)的生命周期:

kotlin 复制代码
@Composable
fun ObserveLifecycleEvents() {
    val lifecycleOwner = LocalLifecycleOwner.current

    DisposableEffect(lifecycleOwner) {
        val observer = LifecycleEventObserver { _, event ->
            println("Lifecycle event: $event")
        }

        lifecycleOwner.lifecycle.addObserver(observer)

        onDispose {
            lifecycleOwner.lifecycle.removeObserver(observer)
        }
    }
}

🔄 生命周期对比表

传统生命周期 Compose 替代
onCreate() LaunchedEffect(Unit)
onResume() LaunchedEffect(key)
onPause() / onStop() onDispose in DisposableEffect
onDestroy() onDispose
状态绑定 View 状态驱动组合 UI

✅ 小结

API 触发时机 用途
LaunchedEffect 初次组合或 key 变化 异步任务、网络请求
DisposableEffect 组合 + 清理 注册监听、取消绑定
SideEffect 每次重组后 外部同步、日志记录
rememberUpdatedState 始终使用最新值 动态回调、协程中更新状态
LocalLifecycleOwner 获取宿主生命周期 与原生协同工作
相关推荐
LucianaiB1 小时前
【元宝搜索开发者征文大赛】AI时代,学得慢就不用学?用元宝搜索打造一个教程保质期,确保每一个教程符合你的现状
前端·人工智能·ai编程
excel1 小时前
JavaScript 对象池:减少高频对象创建与 GC 压力
前端
陈随易3 小时前
纯 Go 写的 JS 引擎,跑分超过了 C 语言的 QuickJS
前端·后端·程序员
子兮曰5 小时前
Chrome 权限元素实战:144 与 151 的渐进增强写法
前端·javascript·chrome
IT_陈寒5 小时前
Redis连接池泄漏那次,我差点把生产环境搞崩了
前端·人工智能·后端
强尼银手5 小时前
我花一天做了个格斗游戏原型,判定全对,然后被「美术」劝退了
前端·javascript
石小石Orz5 小时前
AI 正在蚕食我们的编码能力
前端·后端·算法
陈随易6 小时前
专注飞机 FocusFlight,两个人把番茄钟做成了一趟航班
前端·后端·程序员
总要学点什么6 小时前
第98篇:三维特效-材质线效果——给一条线换十种材质,虚线的图案只填了一半
开发语言·前端·javascript·ecmascript·gis·webgl·材质
10share7 小时前
基于大模型的 i18n 方案:把中文原文当 Key,轻松搞定多语言维护
前端·vue.js