es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Aún necesitamos LiveData en Jetpack Compose, o podemos simplemente usar Compose State?

Tengo un ViewModel como el siguiente que tiene tanto LiveData como Compose State

@Suppress("UNCHECKED_CAST")
class SafeMutableLiveData<t: any="">(value: T) : LiveData<t>(value) {

    override fun getValue(): T = super.getValue() as T
    public override fun setValue(value: T) = super.setValue(value)
    public override fun postValue(value: T) = super.postValue(value)

}

class MainViewModel: ViewModel() {

    private val _liveData: SafeMutableLiveData<int> = SafeMutableLiveData(0)
    val liveData: SafeMutableLiveData<int> = _liveData

    var composeState: Int by mutableStateOf(0)

    fun triggerLiveData() {
        _liveData.value = _liveData.value + 1
        composeState++
    }

}

Tanto composeState como liveData de arriba hacen lo mismo y son utilizados por mi vista de Compose de la siguiente manera

@Composable
fun MyComposeView(viewModel: MainViewModel) {
    val liveDataResult = viewModel.liveData.observeAsState()
    Column {

        Button(onClick = { viewModel.triggerLiveData() }) {
            Text(text = "Haz clic")
        }

        Text(text = "${viewModel.number} ${liveDataResult.value}")
    }
}

Nota que tanto los valores de LiveData como de Compose State son:

  • Preservados cuando ocurre un cambio de orientación.
  • Destruidos cuando se reinicia (la aplicación es cerrada por el sistema).
  • No actualizan la vista de Compose, es decir, cuando el contenedor de la actividad/fragmento ya no existe (por ejemplo, no va a fallar la aplicación como ocurre con los callbacks de RxJava cuando el fragmento/actividad ya no está presente).

Parece que LiveData no brinda más beneficios que las variables de Compose State. Tiene complicaciones adicionales como tener que agregar .observeAsState().

¿Hay algún escenario en el que todavía debamos usar LiveData en lugar de variables de Compose State en nuestro ViewModel cuando estamos programando solo con Jetpack Compose?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, todavía hay escenarios donde debemos usar LiveData en lugar de la variable de estado de Compose en nuestro ViewModel al programar solo en Jetpack Compose.

    1. Compartir datos: LiveData puede ser observado y compartido entre varios componentes, como fragmentos y actividades, mientras que el Estado de Compose es local a la jerarquía de la interfaz de usuario. LiveData puede ser utilizado para compartir datos entre varios componentes de la interfaz de usuario, incluso aquellos en diferentes jerarquías de interfaz de usuario, y asegura que todos los observadores reciban la última actualización de datos.
    2. Integración con la base de datos: LiveData está bien integrado con Room, la biblioteca de persistencia de Android, lo que facilita la observación de cambios en las entidades de la base de datos. El Estado de Compose no tiene soporte incorporado para la integración con la base de datos y requeriría trabajo adicional para conectarse a Room.

    3. Conciencia del ciclo de vida: LiveData es consciente del ciclo de vida de Android y automáticamente deja de actualizar la interfaz de usuario cuando la aplicación está en segundo plano o cuando el componente de la interfaz de usuario se destruye. El Estado de Compose no tiene soporte incorporado para la conciencia del ciclo de vida y requeriría trabajo adicional para manejar esto.

    En resumen, aunque el Estado de Compose puede parecer una opción más simple, LiveData todavía tiene beneficios en escenarios como compartir datos, integración con la base de datos y conciencia del ciclo de vida. Es importante considerar el caso de uso específico y los requisitos al decidir qué enfoque utilizar.

Comments are closed.