Integrar o ciclo de vida ao Compose

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

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

Essas integrações fornecem hooks convenientes para gerenciar ciclos de vida na hierarquia do Compose. Este documento descreve como eles podem ser usados 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 Lifecycle 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 executar um bloco quando ocorre uma Lifecycle.Event específica.

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 novamente.

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 fazia parte do bloco inicial.

LifecycleStartEffect {
  // ON_START code is executed here

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

LifecycleResumeEffect

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

LifecycleResumeEffect {
  // ON_RESUME code is executed here

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