You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Compose页面ON_DESTROY事件触发两次的优化方案咨询

检测Compose页面ON_DESTROY事件的可靠实现方式

你当前实现Compose页面ON_DESTROY事件监听时遇到了事件触发两次的问题,虽然用isObserverAdded标志试图避免重复添加观察者,但LaunchedEffect会在页面首次组合、从其他页面返回时重复执行,导致逻辑不够可靠。确实,DisposableEffect是更适合这个场景的API,它专门用于处理需要在Compose组件离开组合时执行清理操作的逻辑,无需手动维护状态标志。

你的原有代码:

// Remember the observer to avoid creating multiple instances
val observer = remember {
    object : LifecycleEventObserver {
        override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
            if (event == Lifecycle.Event.ON_DESTROY) {
                // Perform cleanup actions when screen is destroyed
                Log.d(TAG,"Screen is destroyed")
            }
        }
    }
}

// Remember a flag to check if the observer has been added
val isObserverAdded = remember { mutableStateOf(false) }

LaunchedEffect(key1 = lifecycleOwner.lifecycle) {
    if(!isObserverAdded.value){
        lifecycleOwner.lifecycle.addObserver(observer)
    }
}

基于DisposableEffect的优化实现:

val observer = remember {
    object : LifecycleEventObserver {
        override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
            if (event == Lifecycle.Event.ON_DESTROY) {
                // 执行页面销毁时的清理操作
                Log.d(TAG, "Screen is destroyed")
            }
        }
    }
}

DisposableEffect(key1 = lifecycleOwner.lifecycle) {
    // 组合生效时添加观察者
    lifecycleOwner.lifecycle.addObserver(observer)
    
    // 返回一个清理函数,在组件离开组合时自动执行
    onDispose {
        lifecycleOwner.lifecycle.removeObserver(observer)
    }
}

为什么这个方案更可靠:

  • 自动管理生命周期:DisposableEffect会在组件首次组合时执行添加逻辑,当组件离开组合(比如页面销毁、导航到其他页面)时自动调用onDispose中的移除逻辑,完全不需要手动维护isObserverAdded这类状态标志。
  • 避免重复添加:只要key(这里是lifecycleOwner.lifecycle)不变,DisposableEffect不会重复执行添加操作,从其他页面返回时也不会重复添加观察者,从根源上避免了ON_DESTROY事件被多次触发的问题。
  • 与Compose生命周期对齐:DisposableEffect的执行时机完全贴合Compose组件的生命周期,比LaunchedEffect更适合处理这类需要绑定组件生命周期的资源监听/清理逻辑。

内容的提问来源于stack exchange,提问作者Santhosh Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:58:12