0Pricing
Android Academy · Lección

collectAsStateWithLifecycle

Recopile flows de forma segura con el ciclo de vida

collectAsStateWithLifecycle es una lección gratuita de Android Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Android Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Android Academy incluye 4 lecciones en total.

Recopilar flujos de forma segura

Cuando un Composable recopila un flujo, lo ideal es que deje de recopilar mientras la pantalla está en segundo plano y reanude la recopilación cuando vuelva.

La herramienta para esto es collectAsStateWithLifecycle().

El problema de collectAsState

collectAsState() sin más sigue recopilando mientras el Composable esté en la composición, incluso cuando la aplicación está en segundo plano.

Esto puede desperdiciar recursos y procesar actualizaciones que el usuario no puede ver.

Llega collectAsStateWithLifecycle

Este recopilador consciente del ciclo de vida pausa la recopilación cuando el ciclo de vida baja de un estado objetivo (STARTED de forma predeterminada) y la reanuda cuando vuelve a él.

import androidx.lifecycle.compose.collectAsStateWithLifecycle

@Composable
fun Screen(vm: MyViewModel) {
    val state by vm.uiState
        .collectAsStateWithLifecycle()
    Text(state.title)
}

La dependencia

Se encuentra en el artefacto androidx.lifecycle:lifecycle-runtime-compose. Añádalo a su módulo para que la importación se resuelva.

// build.gradle (module)
implementation(
  "androidx.lifecycle:lifecycle-runtime-compose:2.x.x"
)

Estado mínimo predeterminado: STARTED

De forma predeterminada, la recopilación está activa mientras el ciclo de vida se encuentre al menos en STARTED, lo que significa que la pantalla es visible. Cuando pasa a segundo plano (por debajo de STARTED), la recopilación se suspende.

Personalizar el estado mínimo

Puede cambiar el umbral con minActiveState, por ejemplo, a RESUMED.

val state by vm.uiState.collectAsStateWithLifecycle(
    minActiveState = Lifecycle.State.RESUMED
)

Combinarlo con StateFlow

Esto funciona perfectamente con el StateFlow que expone desde un ViewModel. El flujo siempre tiene un valor actual, por lo que al volver a recopilarlo se muestra inmediatamente el estado más reciente.

private val _uiState = MutableStateFlow(UiState())
val uiState = _uiState.asStateFlow()

Por qué ahorra trabajo

Si su flujo activa un cálculo costoso (filtrar una lista grande o transformar flujos), suspender la recopilación en segundo plano significa que ese trabajo simplemente no se ejecuta mientras el usuario no está presente.

Combinarlo con viewModelScope

En el lado del productor, el ViewModel suele ejecutar su canalización de datos en viewModelScope. Con stateIn, incluso puede hacer que el flujo ascendente se detenga cuando no haya recopiladores.

val uiState = repository.stream()
    .stateIn(
        scope = viewModelScope,
        started = SharingStarted.WhileSubscribed(5000),
        initialValue = UiState()
    )

Explicación de WhileSubscribed

WhileSubscribed(5000) mantiene activo el flujo ascendente durante 5 segundos después de que se marche el último recopilador. Esto evita reiniciar el trabajo durante breves cambios de configuración y, a la vez, lo detiene cuando el usuario realmente abandona la pantalla.

Resumen de buenas prácticas

Para las pantallas de Compose respaldadas por un ViewModel:

  • Exponga un StateFlow.
  • Recopílelo con collectAsStateWithLifecycle().
  • Opcionalmente, use stateIn(WhileSubscribed) en el flujo ascendente.

Comprobación rápida

Compruebe su comprensión de la recopilación consciente del ciclo de vida.

Resumen

Ha aprendido lo siguiente:

  • collectAsStateWithLifecycle() pausa la recopilación en segundo plano.
  • El umbral predeterminado es STARTED, y se puede ajustar mediante minActiveState.
  • Combínelo con un StateFlow y stateIn(WhileSubscribed) para obtener una canalización eficiente.

Preguntas frecuentes

¿La lección «collectAsStateWithLifecycle» es gratis?

Sí — el texto completo de «collectAsStateWithLifecycle» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Android Academy, actualiza a CoddyKit PRO. El curso de Android Academy incluye 4 lecciones en total.

¿Qué aprenderé en «collectAsStateWithLifecycle»?

Recopile flows de forma segura con el ciclo de vida Practicas Android Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Android Academy?

No se requiere experiencia previa. Android Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «collectAsStateWithLifecycle»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Android Academy?

Sí. Cada lección de Android Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. ¿Por qué usar un ViewModel?
  2. Exponer el estado desde ViewModel
  3. El ciclo de vida de Android
  4. collectAsStateWithLifecycle
← Volver a Android Academy