transformations - Android MVVM: Actividad con varios fragmentos: ¿Dónde colocar LiveData compartido?
mvvm retrofit2 (1)
Tengo una pregunta arquitectónica sobre los modelos de vista de Android:
Digamos que en mi aplicación tengo una actividad con dos fragmentos dentro (usando un Viewpager). Los dos fragmentos hacen cosas diferentes (por lo tanto, ¿pueden tener su propio ViewModel?), Pero ambos también necesitan varios datos que sean similares.
Este es, por ejemplo, el estado si una conexión de red está disponible o no (y ambos fragmentos muestran diferentes IU de error si no hay conexión), o alguna configuración del usuario que se realiza a través de un Push desde un servidor y afecta a ambos fragmentos por igual.
Esto se ve algo como esto:
¿Ahora mi pregunta es cómo lidiar con esa situación al usar ViewModels? ¿Es bueno que una vista observe varios ViewModels, como lo sería si tuviera un ViewModel para la Actividad (manteniendo el estado que ambos necesitan por igual) y uno para cada fragmento, como este:
Esto se indicó here por ejemplo, pero no es una buena práctica, ya que la relación en MVVM generalmente es
Ver n - 1 ViewModel n - 1 Modelo
¿Pero no estoy seguro de cuál es el lugar adecuado para este LiveData compartido en mi caso?
Creo que el concepto detrás de ViewModel es que se supone que está relacionado con una única " Pantalla " en lugar de una " Vista ". Entonces, siguiendo esa lógica, creo que puede usar el mismo ViewModel si varios fragmentos hacen referencia al mismo ViewModel porque técnicamente pertenecen a la misma " Pantalla ".
En los fragmentos, puede solicitar la actividad para ViewModel, que contiene la instancia de LiveData y podría darle las actualizaciones según sea necesario.
Espero que esto responda a su pregunta.
Actualización: he encontrado un enlace a un fragmento de muestra en las muestras de Google . Echa un vistazo a el método onCreateView (). Pegando el siguiente código para referencia:
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View root = inflater.inflate(R.layout.addtask_frag, container, false);
if (mViewDataBinding == null) {
mViewDataBinding = AddtaskFragBinding.bind(root);
}
mViewModel = AddEditTaskActivity.obtainViewModel(getActivity());
mViewDataBinding.setViewmodel(mViewModel);
setHasOptionsMenu(true);
setRetainInstance(false);
return mViewDataBinding.getRoot();
}
PD: Si ha encontrado una mejor solución / respuesta / práctica, déjeme saber.