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.

Usa el viewmodel para un fragment llamado “twice”.

Tengo una navegación como sigue:

FragmentList -> FragmentDetailA -> FragmentDetailB -> FragmentDetailC

Utilizo un viewModel para el detalle FragmentDetailViewModel

private val detailViewModel: DetailViewModel by activityViewModels()

Pero si avanzo y luego retrocedo, los fragmentos FragmentDetails anteriores cambian. ¿Cómo asignar un viewModel al fragmento sin cambiar los demás?

Solución:

Primero, cambia activityViewModels() por viewModels()

Luego, el problema estaba con setFragmentResultListener. Se llamaba antes de instanciar el nuevo fragmento, por lo que la llamada se realizaba en Fragment A y no en Fragment B. Decidí pasar datos entre destinos con objetos Bundle.

Muchas gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para asignar un viewModel a un fragmento específico sin cambiar los demás, puedes seguir los siguientes pasos:

    1. Elimina la función activityViewModels() y en su lugar utiliza el método viewModels(). Esto asegurará que el viewModel solo se asigne al fragmento actual.
      private val detailViewModel: DetailViewModel by viewModels()
      
    2. Utiliza objetos Bundle para pasar datos entre los fragmentos, en lugar de setFragmentResultListener. Esto garantizará que los datos solo se pasen al fragmento deseado.
      // En FragmentDetailA
      val bundle = Bundle().apply {
         putString("data", "algunos datos")
      }
      val fragmentDetailB = FragmentDetailB().apply {
         arguments = bundle
      }
      parentFragmentManager.beginTransaction()
         .replace(R.id.fragment_container, fragmentDetailB)
         .addToBackStack(null)
         .commit()
      
      // En FragmentDetailB
      val data = arguments?.getString("data")
      detailViewModel.setData(data)
      

    Siguiendo estos pasos, podrás asignar un viewModel a un fragmento específico sin afectar a los demás y pasar datos entre los fragmentos utilizando objetos Bundle.

Comments are closed.