Le problème est assez simple. La question se situe dans le contexte de l’utilisation de ViewModels, LiveData et d’autres approches liées Lifecycle aware Arch .
J'ai une activité avec NavDrawer, qui permet de basculer des fragments à l'intérieur.
Et aussi j'ai un cas où deux fragments sont présents en même temps sur l'écran - ce sera la douleur principale . Un fragment a un ViewPager avec Fragments
(ne demande pas pourquoi) . L'autre fragment ne fait qu'obtenir des informations du premier lorsque l'utilisateur effectue certaines actions. Ceci est réalisé simplement en partageant le modèle de vue d'activité. Mais l'application elle-même a beaucoup de logique commerciale et, à mesure qu'elle avance, le modèle de vue devient de plus en plus grand .
Ce que je veux demander - pas un reçu ni des règles sur la façon de résoudre ce problème, ou peut-être de le surmonter en fixant la structure entière du projet. Je souhaite demander des suggestions sur l'application de l'approche MVVM dans le style Android.Arch.lifecycle au cas d'utilisation de la mine .
Je n'ai pas vu quelque chose de plus compliqué que le partage du modèle de vue d'activité entre fragments Mais commun, ce n'est pas un remède .
Ce que vous pouvez voir ici - un gâchis en fait. Le fait est que tous partagent le ActivityViewModel
. Les connexions (agrégation) de FirstFragment signifient que ViewPager
à l'intérieur de FirstFragment
est en train de démarrer ChildFragments
et qu'ils travaillent également avec le même ActivityViewModel
(tuez-moi). En conséquence, tout le monde travaille avec un ViewModel partagé.
Ma proposition est d'ajouter un ViewModel pour chaque couche. Donc, cette activité/ces fragments/ces ChildFragments ont leur propre ViewModels . Mais ce qui apparaît ici - comment nous devrions communiquer alors?
Solutions possibles :
D'autres solutions, telles que DB/SharedPrefs/Realm, modifient les écouteurs et les bus d'événement (je suis trop vieux pour cela :().
Votre solution ici!
Je dirai que tout ce qui précède enfreint beaucoup de principes de conception, alors que dois-je faire? Comment puis-je sortir de ce gâchis? Existe-t-il un Uncle Bob
ou un autre superhero
pour vous aider?
P.S. - Eh bien, créer des UML ou d'autres graphiques n'est pas mon fort. Désolé.
P.P.S. - Je suis au courant de googlesamples .
_ {Ce que je suggérerais} que vous pouvez faire est de gérer deux ViewModel
pour l'ensemble de votre cas d'utilisation.
Faites une ViewModel
Disons que MyActivityViewModel
gérera toute la logique liée au niveau activité. Donc, si une logique fragment _ est directement liée à votre activité_, partagez votre ViewModel
comme suit:
ViewModelProviders.of(getActivity()).get(MyActivityViewModel.class); // Like this in fragment.
Et
ViewModelProviders.of(this).get(MyActivityViewModel.class); // Like this in activity.
Ceci partagera la ViewModel
commune entre votre activité et fragment.
Une autre ViewModel
irait pour FirstFragment
dans votre cas si vous devez partager la logique entre votre ChildFragment
:
Ici, vous pouvez partager ViewModel
disons FragmentViewModel
comme ci-dessous:
ViewModelProviders.of(this).get(FragmentViewModel.class); // Like this in FirstFragment which is having view pager.
Et
ViewModelProviders.of(getParentFragment()).get(FragmentViewModel.class); // Like this in View pager fragments, getParentFragment() is First fragment in our case.
Bien que nous puissions toujours utiliser notre niveau d'activité MyActivityViewModel
dans nos fragments enfants de FirstFragment tels que:
ViewModelProviders.of(getActivity()).get(MyActivityViewModel.class);