Skip to content

生命周期

Compose Multiplatform 中的组件生命周期沿用了 Jetpack Compose 生命周期的概念。 生命周期感知的组件能够响应其他组件的生命周期状态变化,帮助你产出组织更良好、通常更轻量级且更易于维护的代码。

Compose Multiplatform 提供了一个公共的 LifecycleOwner 实现,它将 Jetpack Compose 的原始功能扩展到其他平台,并帮助在公共代码中观察生命周期状态。

要使用多平台 Lifecycle 实现,请将以下依赖项添加到你的 commonMain 源代码集:

kotlin
kotlin {
    // ...
    sourceSets {
        // ...
        commonMain.dependencies {
            // ...
            implementation("org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose:2.9.2")
        }
        // ...
    }
}

你可以在我们的新增功能中追踪多平台 Lifecycle 实现的变更,或在 Compose Multiplatform 变更日志中关注特定的抢先体验预览版本。

状态与事件

生命周期状态和事件的流转(与 Jetpack 生命周期相同):

生命周期图

生命周期实现

Composables 通常不需要独有的生命周期:一个公共的 LifecycleOwner 为所有相互连接的实体提供一个生命周期。默认情况下,所有由 Compose Multiplatform 创建的 Composables 共享同一生命周期——它们可以订阅其事件、引用生命周期状态等等。

LifecycleOwner 对象作为 CompositionLocal 提供。 如果你想为特定的可组合项子树单独管理生命周期,你可以创建自己的 LifecycleOwner 实现。

在使用多平台生命周期中的协程时,请记住 Lifecycle.coroutineScope 值绑定到 Dispatchers.Main.immediate 值,该值在桌面目标平台中可能默认不可用。 要使生命周期中的协程和流在 Compose Multiplatform 中正常工作,请将 kotlinx-coroutines-swing 依赖项添加到你的项目。 关于 Dispatchers.Main 的详情,请参见文档

  • 关于导航组件中生命周期如何工作,请了解导航与路由
  • 关于多平台 ViewModel 实现的更多信息,请参见公共 ViewModel 页面。

将 Android 生命周期映射到其他平台

iOS

原生事件和通知生命周期事件生命周期状态变更
viewDidDisappearON_STOPSTARTEDCREATED
viewWillAppearON_STARTCREATEDSTARTED
willResignActiveON_PAUSERESUMEDSTARTED
didBecomeActiveON_RESUMESTARTEDRESUMED
didEnterBackgroundON_STOPSTARTEDCREATED
willEnterForegroundON_STARTCREATEDSTARTED
viewControllerDidLeaveWindowHierarchyON_DESTROYCREATEDDESTROYED

Web

由于 Wasm 目标平台的限制,生命周期:

  • 跳过 CREATED 状态,因为应用程序始终附加到页面。
  • 永远不会达到 DESTROYED 状态,因为网页通常只有当用户关闭标签页时才会被终止。
原生事件生命周期事件生命周期状态变更
blurON_PAUSERESUMEDSTARTED
focusON_RESUMESTARTEDRESUMED

桌面

Swing 监听器回调生命周期事件生命周期状态变更
windowIconifiedON_STOPSTARTEDCREATED
windowDeiconifiedON_STARTCREATEDSTARTED
windowLostFocusON_PAUSERESUMEDSTARTED
windowGainedFocusON_RESUMESTARTEDRESUMED
disposeON_DESTROYCREATEDDESTROYED