¿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?
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.
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.
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.