Meilleures pratiques pour Android MVVM startActivity
je construis une application Android en utilisant MVVM et DataBinding. Et j'ai une fonction à l'intérieur de mon modèle de vue qui commence une activité. Est-ce que c'est bon d'avoir un appel onClick à l'intérieur d'un ViewModel?
Comme ceci.
public class MyViewModel {
public void onClick(View view, long productId) {
Context context = view.getContext();
Intent intent = new Intent(context, ProductDetailActivity.class);
intent.putExtra("productId", productId);
context.startActivity(intent);
}
}
Et dans mon XML:
...
android:onClick="@{(v) -> viewModel.onClick(v, viewModel.product.id)}">
ou serait-ce une bonne pratique de le déplacer vers la vue et de l'appeler depuis EventBus ou Rx et de n'avoir que du POJO dans mon ViewModel?
3 réponses
La réponse à votre question-quel est votre objectif?
si vous voulez utiliser MVVM pour la séparation des préoccupations afin que vous puissiez tester votre Viewmodel
alors vous devriez essayer de garder tout ce qui nécessite un Context
séparer de votre Viewmodel
. Viewmodel
contient la logique de base de votre application et ne devrait pas avoir de dépendances externes.
cependant j'aime où vous allez :) si la décision de L'activité est ouverte réside dans la vue, puis il est très très difficile d'écrire un test Unitaire. Cependant, vous pouvez passer un objet dans l' Viewmodel
qui exécute le startActivity()
appel. Maintenant dans votre test unitaire vous pouvez simplement vous moquer de cet objet et vérifier que le Activity
ouvert
C'est absolument parfait pour le mettre à l'intérieur ViewModel
, cependant, vous devez définir votre ViewModel
Activity
/Fragment
.
voici quelques liens que vous pouvez suivre pour apprendre l'architecture MVVM.
Approche Android avec MVVM
Android MVVM
https://github.com/ivacf/archi
People-MVVM
MVVM sur Android: Ce que Vous Devez Savoir
La façon dont je le fais, c'est, dans votre ViewModel:
val activityToStart = MutableLiveData<Pair<KClass<*>, Bundle?>>()
cela vous permet de vérifier la classe d'activité commencée, et les données passées dans le faisceau. Puis, dans votre Activité, vous pouvez ajouter ce code:
viewModel.activityToStart.observe(this, Observer { value ->
val intent = Intent(this, value.first.java)
if(value.second != null)
intent.putExtras(value.second)
startActivity(intent)
})