web-dev-qa-db-fra.com

Dans MVP est la responsabilité onClick de View ou Presenter?

Dans le modèle MVP, qui est chargé de gérer les clics sur l'interface utilisateur?
Par exemple. l'approche non MVP serait quelque chose comme:

counterButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
      totalClicks++;
      counterTextView.setText("Total clicks so far: "+totalClicks);
    }
  });

L'utilisation de MVP est la onClick la responsabilité du Presenter? Ou le View peut gérer cela?
Quelqu'un peut-il clarifier cela?

22
Jim

OnClick doit appeler une méthode Presenter. Vous devez faire vos affaires dans le présentateur et si vous avez besoin de mettre à jour l'interface utilisateur, vous devez définir une méthode dans votre View et l'appeler à partir du présentateur.

Vous avez besoin d'une méthode pour votre View ex:

public void showCounterCount(final int totalClicks){
     counterTextView.setText("Total clicks so far: "+totalClicks);
}

Vous avez également besoin d'une méthode et d'une variable dans votre Presenter:

int totalClicks = 0;

public void onCounterButtonClicked(){
    totalClicks++;
    mView.showCounterCount(totalClicks);
}

Et refactorisez votre code comme ceci:

counterButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
      mPresenter.onCounterButtonClicked();
    }
  });

Pour une architecture plus complexe et plus propre, vous pouvez faire votre cas d'utilisation dans les interacteurs. (Dans votre exemple, l'incrémentation d'une valeur de compteur est un cas d'utilisation pour votre application)

Vous pouvez définir un interacteur et y incrémenter votre valeur de compteur.

CounterInteractor:

public CounterInteractor{
   public int incrementCounter(int currentCounter){
       return currentCounter+1;
   }
}

Et refactorisez votre présentateur comme ci-dessous:

int totalClicks = 0;
CounterInteractor mCounterInteractor = new CounterInteractor();

public void onCounterButtonClicked(){
    totalClicks = mCounterInteractor.incrementCounter(totalClicks);
    mView.showCounterCount(totalClicks);
}

Avec cette approche, vous séparez totalement votre logique métier des présentateurs et réutilisez vos concepts de cas d'utilisation sans dupliquer le code dans les présentateurs. C'est une approche plus propre.

Vous pouvez également consulter ce dépôt git pour différentes approches MVP. https://github.com/googlesamples/Android-architecture/tree/todo-mvp-clean/

Bonne chance.

Éditer:

Voici ma source de projet client wikipedia léger: https://github.com/savepopulation/wikilight

J'essaie d'implémenter MVP. (MVP + Dague2 + RxJava)

32
savepopulation

Dans MVP, il est de la responsabilité de la vue de savoir comment capturer le clic, et non de décider quoi faire à ce sujet. Dès que la vue capture le clic, elle doit appeler la méthode appropriée dans le Presenter pour agir en conséquence:

------------------- Vue --------------------

button1.setOnClickListener(new OnClickListener({
presenter.doWhenButton1isClicked();
}));

------------------ Présentateur ----------------

public void doWhenButton1isClicked(){
// do whatever business requires
}

J'ai une série d'articles sur les modèles architecturaux dans Android, partie dont MVP. Vous pourriez trouver cela utile.

4
Ali Nem