web-dev-qa-db-fra.com

ViewModel for Fragment accède à l'activité à View View Model?

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 .  enter image description here

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 :

  • Avoir deux ViewModels par composant. Un ViewModel gérera/déléguera la logique métier et un autre fera la communication. Deux modèles de vue par composant - pas si bon, oui?
  • Avoir une ancienne interface (s'il vous plait non!)
  • 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 .

11
Yurii Tsap

_ {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);
0
Jeel Vankhede