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?

16
demandé sur Felipe Kenji Shiba 2016-11-08 00:53:25

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

10
répondu Kaskasi 2018-04-15 06:21:19

C'est absolument parfait pour le mettre à l'intérieur ViewModel, cependant, vous devez définir votre ViewModelActivity/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

6
répondu Ravi Rupareliya 2016-11-08 04:36:15

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)
})
-1
répondu gahfy 2018-07-10 03:50:00