Integrar o ciclo de vida ao Compose

A biblioteca Lifecycle inclui APIs que permitem a integração com o Jetpack Compose. As principais APIs incluem:

  • Fluxos para o Lifecycle.State atual.
  • LifecycleEffects, que permite executar um bloco com base em um Lifecycle.Event específico.

Essas integrações fornecem hooks convenientes para gerenciar ciclos de vida na hierarquia do Compose. Este documento descreve como elas podem ser usadas no seu app.

Coletar o estado do ciclo de vida com fluxos

O ciclo de vida expõe uma propriedade currentStateFlow, que fornece o Lifecycle.State atual como um StateFlow do Kotlin. Você pode coletar esse Flow como State. Isso permite que o app leia mudanças no ciclo de vida durante a composição.

val lifecycleOwner = LocalLifecycleOwner.current
val stateFlow = lifecycleOwner.lifecycle.currentStateFlow

val currentLifecycleState by stateFlow.collectAsState()

O exemplo anterior pode ser acessado usando o módulo lifecycle-common. O método currentStateAsState() está disponível no módulo lifecycle-runtime-compose, que permite ler o estado atual do ciclo de vida com uma única linha. O exemplo abaixo demonstra isso:

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

Executar código em eventos de ciclo de vida

Há também LifecycleEffects que permitem gerar um bloco quando ocorre um Lifecycle.Event específico.

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

Além de LifecycleEventEffect, também é possível usar LifecycleStartEffect e LifecycleResumeEffect. Essas APIs estão vinculadas a eventos específicos. Elas também oferecem um bloco extra no bloco principal que ajuda a limpar qualquer código que o evento possa ter iniciado.

LifecycleStartEffect

O LifecycleStartEffect é semelhante ao LifecycleEffect, mas é executado apenas em eventos Lifecycle.Event.ON_START. Ele também aceita chaves que funcionam como outras chaves do Compose. Quando a chave muda, ela aciona o bloco para ser executado de novo.

Quando há um evento Lifecycle.Event.ON_STOP ou o efeito sai da composição, ele executa um bloco onStopOrDispose. Isso permite a limpeza de qualquer trabalho que fez parte do bloco inicial.

LifecycleStartEffect {
  // ON_START code is executed here

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

LifecycleResumeEffect

O LifecycleResumeEffect funciona da mesma forma que o LifecycleStartedEffect, mas é executado no evento Lifecycle.Event.ON_RESUME. Ela também fornece um bloco onPauseOrDispose, que faz a limpeza.

LifecycleResumeEffect {
  // ON_RESUME code is executed here

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