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.

Datos de la Vista Modelo pierden su estado cuando son accedidos desde un segundo Fragmento.

Estoy enfrentando un problema con mi ViewModel que utilizo para contener los datos de inicio de sesión del usuario.

Actualizo esta ViewModel con los datos del usuario desde el fragmento A después de que un usuario inicia sesión, pero cuando intento acceder a los datos desde el fragmento B, los campos de datos que acabo de establecer siempre son nulos.

Cuando se inicializa el fragmento B, el campo LiveData del usuario nunca se observa inicialmente, sin embargo, cuando inicio un cambio en el objeto de usuario desde el fragmento B, el cambio se observa correctamente dentro del fragmento B. Parece que los valores anteriores de los campos en mi ViewModel nunca llegan al fragmento B, pero los nuevos valores sí.

Para una verificación de cordura, hice una variable de cadena simple (ni siquiera un objeto LiveData) que establecí en un valor desde el fragmento A, luego, después de navegar al fragmento B, imprimí el valor: está sin inicializar cada vez. Es como si la ViewModel que inyecto en el fragmento B fuera totalmente separada de la ViewModel que inyecto en el fragmento A.

¿Qué me estoy perdiendo que hace que la observación de ViewModel en el fragmento B no se active inicialmente con el último valor conocido de usuario establecido desde el fragmento A?

Fragmento A
“`
class FragmentA : Fragment() {
private val viewModel: LoginViewModel by viewModel()

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

viewModel.user.observe(this, {
    it?.let {
        //Llamado correctamente cada vez
        navigateToFragmentB()
    }
})

val mockUserData = User()
viewModel.loginSuccess(mockUserData)

}

}

Fragmento B

class FragmentB : Fragment() {
private val viewModel: LoginViewModel by viewModel()

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {

viewModel.user.observe(viewLifecycleOwner, { user ->
    user?.let {
        binding.initialsBubble.text = user.getInitials()
    } ?: navigateAway()
})

}

}

ViewModel

class LoginViewModel(
private val loginRepo: LoginRepo
) : ViewModel() {
private val _user = MutableLiveData<user?>()
val user: LiveData<user?> = _user

fun loginSuccess(result: AuthenticationResult) {
val user = loginRepo.login(result)
_user.postValue(user)
}

}</user?></user?>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está relacionado con el delegado viewModel() en Fragment B, que no está consciente de la instancia de ViewModel que fue inyectada en Fragment A. Para solucionar esto, puedes utilizar el delegado by viewModels() en Fragment B en su lugar. Esto asegurará que la misma instancia de ViewModel sea utilizada en ambos Fragmentos, A y B.

Comments are closed.