web-dev-qa-db-fra.com

Lorsque vous utilisez MVVM sur Android, chaque activité doit-elle avoir un (et un seul) ViewModel?

Sur Modèle MVVM , le ViewModel contient la logique métier et informe la View lorsqu'elle doit être mise à jour. Il est également informé par la vue des événements utilisateur.

Si j'ai bien compris, chaque modèle devrait avoir un ViewModel associé. Donc, si nous avons les modèles suivants:

  • Utilisateur
  • Compte

Nous aurions les ViewModels suivants:

  • UserViewModel
  • AccountViewModel

Cependant, tous les exemples que je trouve sur la liaison de données avec MVVM utilisent un seul ViewModel pour une mise en page. Et récemment, Google a introduit le ViewModel class dans Composants d'architecture . Cela m'amène à penser qu'une activité aurait un seul ViewModel qui se connecterait à tous les modèles associés:

Utilisateur/Compte -> ActivityViewModel

Cela devient encore plus compliqué si nous pensons à un RecyclerView . Chaque élément de l'adaptateur peut être un ViewModel lui-même. Par conséquent, une activité avec RecyclerView aurait plusieurs ViewModels dans la liste et un maître pour le contenu de la vue restante (en supposant qu'ils exigent des informations d'un ViewModel). Par exemple:

 enter image description here

Dans cet exemple, nous avons une liste de Account ViewModels et un UserViewModel. Comment cela serait-il intégré dans un seul ActivityViewModel?

10
fhsilva

Google vous suggère d'utiliser 1 ViewModel par View (c'est-à-dire Activity ou Fragment) (voir https://youtu.be/Ts-uxYiBEQ8?t=8m40s ), puis à l'intérieur de chaque ViewModel, vous pouvez en avoir plusieurs. type de modèle. Cependant, le principe MVVM étant de n'avoir qu'un seul type de modèle par ViewModel, la présentation de Google contredit donc ceci: /. Je suppose que vous devrez décider quelle approche convient le mieux à votre application.

En ce qui concerne l’exemple de liste que vous avez mentionné, ce n’est pas ainsi que vous procéderiez, pour les listes, vous utiliseriez la bibliothèque paging . Vous pouvez voir les détails sur la façon d'utiliser ceci à la fin de la vidéo que j'ai liée ci-dessus.

5
Franco

Un modèle de vue est standard. Cependant, même Google suggère que vous pouvez avoir plus d'un modèle de vue. Cela est très pratique lorsque vous associez une application de téléphone à une application de tablette. Lorsque vous combinez plusieurs vues de téléphone sur un seul onglet, il est pratique de réutiliser les modèles. 

Si vous tenez compte des principes SOLID lors de la programmation, le S (responsable unique d'une classe) peut vous amener à utiliser plusieurs modèles de vue. 

Cependant, une vue est à peu près standard et vous devriez avoir des raisons, comme indiqué plus haut, d'en utiliser plus d'une. 

2
Hermann Klecker

Quelle est la relation entre les utilisateurs et les comptes? S'il s'agit de deux modèles distincts non liés, ils doivent avoir chacun leur propre vue et leur propre modèle. N'oubliez pas le principe de responsabilité unique: chaque module ne devrait être responsable que d'une partie de votre logique. De cette manière, toute modification apportée à la logique de votre domaine ou à vos modèles n'affectera que cette partie et uniquement cette partie.

1
Omar Silva

Vous devez avoir un ViewModel par vue (activité, fragment ou vue personnalisée), avec plusieurs LiveData, un pour chaque unité logique. Dans l'image, une unité logique serait constituée des données utilisateur, une autre unité logique serait les données des paramètres. Vous auriez ainsi deux LiveData exposés dans le ViewModel.

 View with multiple LiveData

Ces concepts peuvent également être visibles dans l'architecture d'applications recommandée google présentée dans le dernier Google I/O, où une activité/fragment a 1 ViewModel avec plusieurs LiveData:

 enter image description here

0
Eduardo

S'il existe différents fragments dans une activité ... utilisez un ViewModel différent pour chaque fragment ... si vous utilisez le même ViewModel pour tous les fragments, les données pourraient être perdues ...

0
Shivam Dawar