Neuer Android Injector mit Dagger 2 – Teil 3

Wenn Sie Teil 1 und Teil 2 nicht gelesen haben, empfehle ich Ihnen, sie zuerst zu lesen. Die Links finden Sie unten.

TLDR;

Sie können DaggerActivity, DaggerFragment, DaggerApplication verwenden, um Boilerplate in Ihrer Activity/Fragment/Application zu reduzieren.

Sie können auch AndroidInjector<T> in Ihren Dagger-Komponenten verwenden, um Boilerplate zu reduzieren.

Erinnern Sie sich, dass wir AndroidInjection.inject() für jede Activity oder jedes Fragment aufrufen, das wir mit Dagger verwenden wollen. Und wenn Sie Injection in Ihrem Fragment verwenden möchten, sollten Sie auch die Schnittstelle HasSupportFragmentInject implementieren und den Fragmentinjektor in Ihrer Aktivität überschreiben.

In letzter Zeit habe ich diesen Code in meine Basisaktivität und mein Basisfragment verschoben. Warum sollte ich das für jede einzelne Aktivität deklarieren müssen? Ich denke, sie in die Basisklasse zu verschieben, ist akzeptabel.

Dann sehe ich bei der Recherche einige Klassen im Dolch-Projekt, DaggerAppCompatActivity und DaggerFragment. Diese Klassen tun genau das, was ich getan habe. Android liebt Vererbung. Also können wir so tun, als ob wir das auch lieben 😛

Lassen Sie uns sehen, was in diesen Bibliotheksklassen passiert.

DaggerAppCompatActivity

Nichts anderes eigentlich. Wir können den Boilerplate-Code in unserer Aktivität reduzieren, indem wir unsere Aktivität von DaggerAppCompatActivity erweitern.

Unsere DetailActivity-Klasse war wie folgt;

Erweitern wir sie von DaggerAppCompatActivity und entfernen HasSupportFragmentInjector und die überschriebene Methode aus unserer Aktivität.

Jetzt ist es besser.

DaggerApplication, AndroidInjector, AndroidSupportInjectionModule

Lassen Sie uns sehen, was wir noch tun können, um Boilerplate-Code zu reduzieren. AndroidInjector hilft uns, unsere App-Komponente zu vereinfachen. Sie können die AndroidInjector-Dokumentation hier einsehen.

Lassen Sie uns unsere App-Komponente und Anwendungsklasse betrachten.

build() und seedInstance() sind bereits in der AndroidInjector.Builder-Klasse definiert. Also können wir sie loswerden und unseren Builder von AndroidInjection.Builder<Application> erweitern.

Und auch die AndroidInjector-Schnittstelle hat die inject()-Methode in ihr. Wir können also die inject()-Methode entfernen und unsere AppComponent-Schnittstelle von AndroidInjector<Application>

So wird unsere aktualisierte und auf die Boilerplate reduzierte AppComponent-Schnittstelle wie folgt aussehen

Haben Sie bemerkt, dass wir auch unsere Module geändert haben. Ich habe AndroidInjectionModule.class in den Komponentenmodulen entfernt und AndroidSupportInjectionModule.class hinzugefügt. Dies wurde hinzugefügt, weil wir Support Fragment verwendet haben. AndroidInjectionModule bindet Ihr app.Fragment an Dolch. Aber wenn Sie Injektion in v4.fragment verwenden möchten, dann sollten Sie AndroidSupportInjectionModule.class zu Ihren AppComponent-Modulen hinzufügen.

Wir haben die Art und Weise geändert, wie wir in unsere AppComponent injizieren. Schauen wir uns also an, was sich in unserer Anwendungsklasse geändert hat.

Wie bei DaggerActivity und DaggerFragment müssen wir auch unsere Anwendungsklasse von DaggerApplication erweitern.

Unsere Anwendungsklasse sah wie folgt aus;

Wir haben sie geändert in..

Source

Diese vereinfachte Implementierung finden Sie als Zweig auf meiner Github-Seite. Ich binde sie nicht in Master ein, weil ich in jedem Zweig die Old-School-Methode zur Verwendung von dagger zeigen möchte. So können die Leser den Weg von der alten Methode zur vereinfachten Methode verfolgen.

PS.

Leave a Reply