- Hugo,
Bonjour,
Depuis quelques jours, une nouvelle version de Dagger est en "release candidate", c’est la version 2.10. Dans le changelog, on peut voir "Release of dagger.android classes to simplify injection of Android core types". Une nouvelle section dans la documentation est apparue.
La nouvelle release permettrait de « simplifier », l’injection des dépendances dans les activité et les fragments. De plus, selon eux, cela a un autre avantage, ne plus avoir à préciser comment la classe injecté, l’est ("a class shouldn’t know anything about how it is injected."). Enfin, selon BG_NE sur Reddit, on pourrait plus facilement remplacer les dépendences des activités (pas sur d’avoir compris son commentaire, si quelqu’un pouvait expliquer un peu plus longuement ?!).
Maintenant dans les faits, c’est beaucoup plus compliqué !
Avant cette release
Pour injecter mon presenter dans mon activité, j’avais pour chaque activité, un module et un component, définit comme cela:
Module, injection de la vue au presenter:
1 2 3 4 5 6 7 8 9 10 11 | @Module public class ListNewsPresenterModule { private final ListNewsContract.View mView; public ListNewsPresenterModule(ListNewsContract.View view) { mView = view; } @Provides ListNewsContract.View provideListNewsContractView() { return mView; } } |
puis un component,
1 2 3 4 5 6 | @FragmentScoped @Component(dependencies = DataSourceComponent.class, modules = ListNewsPresenterModule.class) public interface ListNewsComponent { void inject(ListNewsActivity activity); } |
enfin, il était injecté comme cela dans mon activité :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class ListNewsActivity extends BaseActivity { @Inject ListNewsPresenter mPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Create the presenter DaggerStripComponent.builder() .dataSourceComponent(MonSingleton.getInstance(context).getDataSourceComponent()) .displayStripPresenterModule( new ListNewsPresenterModule(mFragment)).build() .inject(this); |
Presenter
1 2 3 4 5 6 7 | @Inject public ListNewsPresenter(StripRepository stripRepository, ListNewsContract.View view) { mStripRepository = stripRepository; mView = view; mView.setPresenter(this); // Envoi du presenter dans le fragment. } |
Après cette release
Dans mon activité, j’ai plus que ça :
1 2 3 4 5 6 7 | public class ListNewsActivity extends BaseActivity { @Inject ListNewsPresenter mPresenter; @Override protected void onCreate(Bundle savedInstanceState) { AndroidInjection.inject(this); |
Pour chaque activité, j’ai un module et un subcomponent.
Module :
1 2 3 4 5 6 7 8 9 | @Module(subcomponents = YourActivitySubcomponent.class) public abstract class YourActivityModule { @Binds @IntoMap @ActivityKey(ListNewsActivity.class) abstract AndroidInjector.Factory<? extends Activity> bindYourActivityInjectorFactory(YourActivitySubcomponent.Builder builder); } |
un subcomponent,
1 2 3 4 5 6 | @Subcomponent() public interface YourActivitySubcomponent extends AndroidInjector<CacheActivity> { @Subcomponent.Builder public abstract class Builder extends AndroidInjector.Builder<CacheActivity> {} } |
J’ai du changer mon AppComponent qui est initialisé dans la classe Application d’Android.
1 2 3 4 5 6 7 | @Component( dependencies = {DataSourceComponent.class}, modules = {AndroidInjectionModule.class, YourActivityModule.class}) public interface MyAppComponent { void inject (MyApp app); } |
et enfin ma classe, Application,
1 2 3 4 | public class MyApp extends Application implements HasDispatchingActivityInjector { @Inject DispatchingAndroidInjector<Activity> dispatchingActivityInjector; |
Mon souci, c’est que mon presenter à besoin d’accéder à ma vue (l’activite) et je vois pas comment faire, vu que je peux rien passer au AndroidInjection.inject(this)
.
Merci d’avance.