2017-08-08 4 views
2

Je me demandais si la liaison android est compatible avec les données en direct sur le niveau conceptuel. Il y a une tâche simple: appeler le serveur après avoir cliqué sur le bouton. Donc, à mon avis, j'aiAndroid Architecture Components, liaison android et LiveData

android:onClick="@{viewmodel::onOrderButtonClick}" 

et une bonne méthode onOrderButtonClick (View) est défini dans ViewModel. Mais pour faire appel au serveur via LiveData, j'ai besoin de ma référence Fragment (la méthode observer() nécessite l'instance de LifecycleOwner comme premier paramètre). Bien sûr, je ne peux pas contenir de référence à fragment dans mon ViewModel. Quel est le modèle ici? Ai-je vraiment besoin d'implémenter toutes les méthodes événementielles de la classe fragment et de les réintégrer dans la classe de modèle de vue?

+0

Je ne mettrais pas 'onOrderButtonClick()' sur un view-model. À mon humble avis, c'est une action de contrôleur ou de présentateur, pas un view-model. – CommonsWare

+0

@CommonsWare, je pense que lorsque vous utilisez la liaison android c'est la seule option – Marcin

+0

Non. Vous pouvez lier tous les objets que vous voulez. Si vous souhaitez lier un modèle de vue (pour remplir des widgets, et éventuellement pour recevoir une sortie via une liaison bidirectionnelle) et un objet contrôleur/présentateur (pour les événements), vous pouvez le faire. Définissez simplement les deux dans la disposition et appelez les méthodes 'set ...()' correspondantes pour les deux. – CommonsWare

Répondre

1

Après quelques fouilles, il y a une mauvaise et une bonne nouvelle. Les mauvaises nouvelles sont que le fragment doit être utilisé de toute façon (il y a toujours un code dans le fragment pour chaque événement LiveData) Le bon est que cela peut être fait relativement propre:

  1. Appel getOrderObservable() du fragment pour voir le modèle. Renvoie MutableLiveData > créé dans ctor du modèle de vue.
  2. appellent ensuite observer() sur cette observable dans onOrderButtonClick()
  3. Dans onOrderButtonClick() de vue modèle dans le modèle de vue suffit d'appeler setValue()

    Cette solution, à mon avis minimalizes quantité de code dans le fragment. Cela ne semble pas si élégant de se séparer de faire l'appel réseau et de gérer le résultat

+0

- puis-je vous demander d'expliquer un peu plus? J'ai également été bloqué en essayant de comprendre comment Databinding, Livedata, ViewModel fonctionnent ensemble et conservent encore l'architecture MVVM. L'un des gros casse-tête est onclick - comment puis-je lancer de nouvelles intentions, etc. Serait bien si vous pouvez expliquer ce que vous avez découvert. – Sandeep

+0

@Sandeep - veuillez être plus précis – Marcin