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.

Confusión con la falta de actualización de la variable MutableLiveData

Trabajando en un proyecto en Kotlin en AndroidStudio, cosas bastante básicas, pero MutableLiveData no está funcionando como espero. ¿Estoy haciendo algo mal o tal vez estoy confundido con cómo funciona?

Estoy usando un viewModel para manejar el LiveData y con fines de prueba, solo estoy ejecutando algún código en el método onCreate de un fragmento:

ViewModel

class UserViewModel : ViewModel() {

    var currentUser: User = DataSource.user

    private var _selectedSkillPoints = MutableLiveData<int>(currentUser.selectedSkill.points) 
    val selectedSkillPoints: LiveData<int> = _selectedSkillPoints
...
}

Fragmento

override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)

     private var user: User = DataSource.user

     user.selectedSkill.points++

     MaterialAlertDialogBuilder(requireContext())
          .setMessage("user.selectedSkill.points = ${user.selectedSkill.points} \n sharedViewModel.selectedSkillPoints.value = ${sharedViewModel.selectedSkillPoints.value}")
          .show()
}

Esperaría que al actualizar currentUser.points también se actualice el LiveData que apunta a él. Pero la Alerta muestra que solo se actualiza currentUser.points mientras que userPoints se mantiene en el mismo valor inicial, por lo que un observador nunca se ejecutará.
Entonces, ¿qué me falta? ¿Cómo puedo hacer que esto funcione como esperaba?
Gracias

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que estás inicializando el MutableLiveData con currentUser.selectedSkill.points en lugar de una referencia a ello. Esto significa que aunque actualices currentUser.selectedSkill.points más tarde, el MutableLiveData _selectedSkillPoints seguirá teniendo el valor original.

    Para asegurarte de que el MutableLiveData refleje los cambios realizados en currentUser.selectedSkill.points, deberías inicializarlo con una referencia a ello en su lugar:

    private val _selectedSkillPoints = MutableLiveData<int>(currentUser.selectedSkill.points)
    val selectedSkillPoints: LiveData<int> = _selectedSkillPoints
    
    ...
    
    // Actualiza el valor de currentUser.selectedSkill.points
    currentUser.selectedSkill.points++
    
    // Notifica a los observadores que el valor ha cambiado
    _selectedSkillPoints.value = currentUser.selectedSkill.points
    

    De esta manera, cada vez que se actualice currentUser.selectedSkill.points, también puedes actualizar el valor de _selectedSkillPoints, lo que activará a los observadores para que actualicen sus vistas en consecuencia.

    ¡Espero que esto sea útil! Avísame si tienes alguna otra pregunta.

Comments are closed.