MVVM Android: activité avec de multiples Fragments - où mettre partagé LiveData?

j'ai architectural question sur l'android Viewmodel:

disons que dans mon application j'ai une activité avec deux Fragments à l'intérieur (en utilisant un Viewpager). Les deux fragments font des choses différentes (donc peuvent avoir leur propre modèle de vue?), mais elles ont aussi besoin de diverses données qui sont similaires.

ceci est par exemple l'état si une connexion réseau est disponible ou non (et les deux fragments montrent une erreur UIs différente s'il n'y a pas de connexion), ou un utilisateur paramètre qui vient par une poussée d'un serveur et affecte les deux fragments de façon égale.

Cela ressemble à quelque chose comme ceci:

enter image description here

maintenant, ma question Est de savoir comment gérer cette situation lorsque vous utilisez des modèles de vue? Est-il bon qu'une vue observe plusieurs modèles de vue, comme ce serait le cas si j'avais un modèle de vue pour L'activité (tenant l'état que les deux ont besoin également) et un pour chaque fragment, comme ceci:

enter image description here

cela a été suggéré ici par exemple, mais ce n'est pas une bonne pratique, comme le relation de MVVM généralement

View n - 1 ViewModel N-1 Model

mais je ne suis pas sûr où le bon endroit pour une telle LiveData partagée est dans mon cas?

17
demandé sur stamanuel 2017-11-23 19:05:18

1 réponses

je pense que le concept derrière le ViewModel est que c'est censé être lié à un seul "Écran" plutôt qu'un " View". Donc, en suivant cette logique, je pense que vous pouvez utiliser le même modèle de vue si plusieurs fragments font référence au même modèle de vue parce qu'ils appartiennent techniquement au même "Écran".

dans les fragments, vous pouvez demander l'activité pour le modèle de vue qui tient L'instance de LiveData et pourrait vous donner les mises à jour en tant que de besoin.

J'espère que cela répondra à votre question.

mise à jour: j'ai trouvé un lien vers un fragment D'échantillon dans Google samples. Check out onreateview () method. Code de collage ci-dessous pour référence:

@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();
}
6
répondu karthik prasad 2018-03-15 14:24:15