Cómo integrar Lifecycle con Compose

La biblioteca de Lifecycle ofrece APIs integradas que te permiten realizar integraciones con Compose de Jetpack. Entre las APIs clave, se incluyen las siguientes:

  • Flujos para la Lifecycle.State actual
  • LifecycleEffects, que te permite ejecutar un bloque basado en un Lifecycle.Event específico

Estas integraciones proporcionan hooks convenientes para administrar ciclos de vida dentro de la jerarquía de Compose. En este documento, se describe cómo puedes usarlas en tu app.

Cómo recopilar el estado del ciclo de vida con flujos

Lifecycle expone una propiedad currentStateFlow que proporciona el Lifecycle.State actual como un StateFlow de Kotlin. Puedes recopilar este Flow como State. Esto permite que tu app lea los cambios del ciclo de vida durante la composición.

val lifecycleOwner = LocalLifecycleOwner.current
val stateFlow = lifecycleOwner.lifecycle.currentStateFlow
…
val currentLifecycleState by stateFlow.collectAsState()

Se puede acceder al ejemplo anterior con el módulo lifecycle-common. El método currentStateAsState() está disponible en el módulo lifecycle-runtime-compose, lo que te permite leer de manera conveniente el estado actual del ciclo de vida con una sola línea. En el siguiente ejemplo, se demuestra esto:

val lifecycleOwner = LocalLifecycleOwner.current
val currentLifecycleState = lifecycleOwner.lifecycle.currentStateAsState()

Cómo ejecutar código en eventos de ciclo de vida

También hay LifecycleEffects que te permiten ejecutar un bloque cuando se produce una Lifecycle.Event en particular.

LifecycleEventEffect(Lifecycle.Event.ON_START) {
  // do something here
}

Además de LifecycleEventEffect, también puedes usar LifecycleStartEffect y LifecycleResumeEffect. Estas APIs están vinculadas a eventos específicos. También ofrecen un bloque adicional dentro del bloque principal que ayuda a borrar el código que pudo haber iniciado el evento.

LifecycleStartEffect

LifecycleStartEffect es similar a LifecycleEffect, pero solo se ejecuta en eventos Lifecycle.Event.ON_START. También acepta claves que funcionan como otras claves de Compose. Cuando la clave cambia, activa el bloque para que vuelva a ejecutarse.

Cuando hay un evento Lifecycle.Event.ON_STOP o el efecto sale de la composición, ejecuta un bloque onStopOrDispose. Esto permite limpiar cualquier trabajo que fuera parte del bloque de partida.

LifecycleStartEffect {
  // ON_START code is executed here

  onStopOrDispose {
    // do any needed clean up here
  }
}

LifecycleResumeEffect

LifecycleResumeEffect funciona de la misma manera que LifecycleStartedEffect, pero, en cambio, se ejecuta en el evento Lifecycle.Event.ON_RESUME. También proporciona un bloque onPauseOrDispose que realiza la limpieza.

LifecycleResumeEffect {
  // ON_RESUME code is executed here

  onPauseOrDispose {
    // do any needed clean up here
  }
}