Dague avec Android: Comment injecter du contexte lors de l’utilisation de MVP?

En développant une application Android, je suis tombé sur un problème. Je viens juste de commencer à utiliser Dagger, je connais donc quelques concepts de base, mais lorsque l’on l’utilise en dehors des didacticiels et de leurs cas d’utilisation, les choses deviennent moins claires.

Donc, pour aller au point. Dans mon application, j’utilise MVP comme décrit dans cet article de blog: http://antonioleiva.com/mvpandroid/

Donc au début, j’injectais la classe Interactor (celle qui gère les données) à la classe Presenter et tout s’est bien passé. Mais ensuite, j’ai implémenté des méthodes qui utilisent la firebase database SQLite. Il était donc nécessaire d’utiliser Context dans ma classe Interactor.

Je n’arrive pas à comprendre comment dois-je faire cela correctement? Mon correctif temporaire consistait à exclure Dagger de mon application et à transmettre la variable de contexte au constructeur lors de la création de la classe Presenter, puis de la classe Interactor dans le présentateur, mais j’aimerais utiliser Dagger.

Donc, mon application actuelle ressemble un peu à ceci.

MyActivity implements MyView { MyPresenter p = new MyPresenter(this, getApplicationContext()); } 

Constructeur dans MyPresenter

 MyPresenter(MyView view, Context context) { this.view = view; MyInteractor i = new MyInteractor(context); } 

Et dans le constructeur de MyInteractor Context à une variable privée.

Je n’aurais besoin que d’injecter MyInteractor dans MyPresenter , car c’est la partie de l’application qui devra être testée par rapport à différentes implémentations. Mais s’il était également possible d’injecter MyPresenter dans MyActivity , ce serait génial 🙂

J’espère que quelqu’un a de l’expérience avec ce que j’essaie de réaliser 🙂

Dans votre classe MyInteractor:

 public class MyInteractor { @Inject public MyInteractor(Context context) { // Do your stuff... } } 

Ma classe de présentateur

 public class MyPresenter { @Inject MyInteractor interactor; public MyPresenter(MyView view) { // Perform your injection. Depends on your dagger implementation, eg OBJECTGRAPH.inject(this) } } 

Pour injecter un contexte, vous devrez écrire un module avec une méthode de fourniture:

 @Module (injects = {MyPresenter.class}) public class RootModule { private Context context; public RootModule(BaseApplication application) { this.context = application.getApplicationContext(); } @Provides @Singleton Context provideContext() { return context; } } 

Injecter votre classe Presenter dans votre activité n’est pas si simple, car dans votre constructeur, vous avez ce paramètre MyView, qui ne peut pas être défini par Dagger. Vous pouvez repenser votre conception en fournissant une méthode setMyView dans votre classe MyPresenter au lieu d’utiliser un paramètre constructeur.

Edit: Création de RootModule

 public class BaseApplication extends Application { // Store Objectgraph as member atsortingbute or use a Wrapper-class or... @Override public void onCreate() { super.onCreate(); OBJECTGRAPH = ObjectGraph.create(getInjectionModule()); } protected Object getInjectionModule() { return new RootModule(this); } }