Utilisation des nouvelles classes utilitaires pour Android dans la nouvelle version de Dagger

a marqué ce sujet comme résolu.

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é :p !

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.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte