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.

Android ViewModel no está obteniendo el elemento seleccionado desde BackStackEntry.

Tengo un fragmento de mapa que se puede acceder desde la barra de navegación inferior. También quiero poder acceder a él desde un clic en mi RecyclerView (si se hace clic desde el RecyclerView, mostrar la ubicación desde el RecyclerView). Para hacer esto, he intentado verificar la pila de retroceso para ver si el fragmento de lista existe. Aunque no puedo hacerlo funcionar, ¿alguien puede ver cuál es el problema con mi código?

ViewModel:

private final MutableLiveData<fish> selected = new MutableLiveData<fish>();

public void select(Fish item) {
selected.setValue(item);
}

public LiveData getSelected() {
return selected;
}

public MapViewModel(Application application){
super(application);
}

ListFragment (select está en el método onclick):

mMapViewModel = ViewModelProviders.of(this).get(MapViewModel.class);
Log.d(“view-click”, String.valueOf(fish.getLocation()));

            mMapViewModel.select(fish);
            Navigation.findNavController(view).navigate(R.id.action_fishListFragment_to_mapFragment2);

MapFragment:

NavController navController = NavHostFragment.findNavController(this);
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.fishListFragment);

mMapViewModel = new ViewModelProvider(backStackEntry).get(MapViewModel.class);
mMapViewModel.getSelected().observe(backStackEntry, list -> {
    Log.d("MAPFRAGMENT",list.getLocation() + "");
});

No obtengo errores, pero tampoco obtengo el registro MAPFRAGMENT en la ventana de registro. He verificado que mi registro está funcionando y que el método onclick está estableciendo el valor en el ViewModel.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código podría ser que el observador en el MapFragment no se está activando como se esperaba. Una posible razón para esto es que la instancia de ViewModel que se está utilizando en el MapFragment no es la misma que se está utilizando en el ListFragment.

    Para asegurarse de que ambos fragmentos están utilizando la misma instancia de ViewModel, podría intentar utilizar un ViewModel compartido. Esto se puede lograr reemplazando la línea:

    mMapViewModel = new ViewModelProvider(backStackEntry).get(MapViewModel.class);
    

    con:

    mMapViewModel = new ViewModelProvider(requireActivity()).get(MapViewModel.class);
    

    Esto creará una instancia de ViewModel que está limitada al ámbito de la actividad, lo que significa que se compartirá entre el ListFragment y el MapFragment. Además, en lugar de utilizar la entrada de la pila para observar el LiveData seleccionado, puede utilizar la actividad como propietario del ciclo de vida:

    mMapViewModel.getSelected().observe(getViewLifecycleOwner(), list -> {
        Log.d("MAPFRAGMENT", list.getLocation() + "");
    });
    

    Esto debería permitir que el observador se active como se espera y registre la ubicación seleccionada en el MapFragment.

Comments are closed.