¿Cómo guardar el estado de ViewModel en los componentes arquitectónicos de Android?
sobes.tech AI
Respuesta de la IA
Se puede guardar el estado de ViewModel de varias maneras:
-
Uso de SavedStateHandle: La forma preferida para guardar pequeñas cantidades de datos necesarios para restaurar el estado después de la destrucción del proceso.
SavedStateHandleproporciona una interfaz similar a un Map para guardar y obtener datos.class MyViewModel(private val state: SavedStateHandle) : ViewModel() { private val _name = state.getLiveData<String>("name") val name: LiveData<String> = _name fun saveName(newName: String) { state.set("name", newName) } } -
Guardar estado en un bundle (Bundle): Se usa junto con
onSaveInstanceStatepara guardar datos del propioActivityoFragment, no directamente delViewModel. Luego, estos datos pueden usarse para inicializar elViewModelal crearlo.// En Activity o Fragment override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) // Guardar datos que luego se usarán para inicializar ViewModel outState.putString("some_data_for_vm", "valor importante") } // Uso de los datos en ViewModel (a través de una fábrica) class MyViewModelFactory(private val initialData: String) : ViewModelProvider.Factory { override fun <T : ViewModel?> create(modelClass: Class<T>): T { if (modelClass.isAssignableFrom(MyViewModel::class.java)) { @Suppress("UNCHECKED_CAST") return MyViewModel(initialData) as T } throw IllegalArgumentException("Clase de ViewModel desconocida") } } class MyViewModel(private val initialData: String) : ViewModel() { // Uso de initialData para restaurar el estado } -
Guardar datos en almacenamiento persistente: Para guardar datos más complejos o de mayor tamaño, se puede usar SharedPreferences, bases de datos (por ejemplo, Room) o archivos.
ViewModelpuede interactuar con un repositorio que gestione el acceso a estos datos.class MyViewModel(private val userRepository: UserRepository) : ViewModel() { fun saveUser(user: User) { userRepository.saveUser(user) } fun getUser(id: Long): LiveData<User> { return userRepository.getUser(id) } } // Ejemplo de UserRepository class UserRepository(private val userDao: UserDao) { fun saveUser(user: User) { // Lógica para guardar en la base de datos } fun getUser(id: Long): LiveData<User> { // Lógica para obtener de la base de datos } }
La elección del método depende del tipo y volumen de datos a guardar, así como de los escenarios de restauración de estado que se necesiten (por ejemplo, destrucción del proceso vs cambio de configuración). SavedStateHandle es la opción más adecuada para guardar el estado que debe sobrevivir a la destrucción del proceso y restaurar la interfaz de usuario.