Wie benutzt man Dolch? Wie konfiguriere ich Dagger für die Arbeit in meinem Android-Projekt?
Ich würde Dagger gerne in meinem Android-Projekt verwenden, finde es aber verwirrend.
EDIT: Dagger2 ist auch seit 2015 04 15 raus und es ist noch verwirrender!
[Diese Frage ist ein "Stub", den ich zu meiner Antwort hinzufüge, wenn ich mehr über Dagger1 und Dagger2 erfahren habe. Diese Frage ist eher ein Leitfaden als eine "Frage".]
android
dependency-injection
dagger
dagger-2
EpicPandaForce
quelle
quelle
ViewModel
und geteilt wirdPageKeyedDataSource
? Wie ich RxJava2 verwende und möchte, dass CompositeDisposable von beiden Klassen gemeinsam genutzt wird, und wenn der Benutzer die Zurück-Taste drückt, möchte ich das Disposable-Objekt löschen. Ich habe hier einen zusätzlichen Fall hinzugefügt: stackoverflow.com/questions/62595956/…ViewModel
einfügen und möglicherweise dasselbe CompositeDisposable als Konstruktorargument Ihrer benutzerdefinierten PageKeyedDataSource übergeben, aber ich würde Dagger für diesen Teil nicht wirklich verwenden, da Sie dann Subkomponenten mit Unterbereich benötigen, und Hilt wird dies nicht wirklich unterstützen einfach für dich.Antworten:
Anleitung für Dolch 2.x (überarbeitete Ausgabe 6) :
Die Schritte sind die folgenden:
1.)
Dagger
zu deinenbuild.gradle
Dateien hinzufügen :.
.
2.) Erstellen Sie Ihre
AppContextModule
Klasse, die die Abhängigkeiten bereitstellt.3.) Erstellen Sie die
AppContextComponent
Klasse, die die Schnittstelle zum Abrufen der injizierbaren Klassen bereitstellt.3.1.) So würden Sie ein Modul mit einer Implementierung erstellen:
Achtung :: Sie müssen die
@Scope
Annotation (wie@Singleton
oder@ActivityScope
) für die mit Annotationen@Provides
versehene Methode des Moduls angeben, um einen Anbieter mit Gültigkeitsbereich innerhalb Ihrer generierten Komponente zu erhalten. Andernfalls wird die Annotation aufgehoben und Sie erhalten bei jeder Injektion eine neue Instanz.3.2.) Erstellen Sie eine Komponente mit Anwendungsbereich, die angibt, was Sie injizieren können (dies entspricht der
injects={MainActivity.class}
in Dolch 1.x):3.3.) Für Abhängigkeiten, die Sie selbst über einen Konstruktor erstellen können und die Sie nicht mit einem neu definieren möchten
@Module
(z. B. verwenden Sie stattdessen Build-Varianten, um den Implementierungstyp zu ändern), können Sie einen@Inject
kommentierten Konstruktor verwenden.Wenn Sie den
@Inject
Konstruktor verwenden, können Sie auch die Feldinjektion verwenden, ohne explizit Folgendes aufrufen zu müssencomponent.inject(this)
:Diese
@Inject
Konstruktorklassen werden automatisch zur Komponente desselben Bereichs hinzugefügt, ohne dass sie explizit in einem Modul angegeben werden müssen.Eine Konstruktorklasse mit
@Singleton
Gültigkeitsbereich@Inject
wird in@Singleton
Komponenten mit Gültigkeitsbereich angezeigt.3.4.) Nachdem Sie eine bestimmte Implementierung für eine bestimmte Schnittstelle definiert haben, gehen Sie wie folgt vor:
Sie müssen die spezifische Implementierung mit a an die Schnittstelle "binden"
@Module
.Eine Abkürzung dafür seit Dolch 2.4 ist die folgende:
4.) Erstellen Sie eine
Injector
Klasse für Ihre Komponente auf Anwendungsebene (sie ersetzt die monolithischeObjectGraph
).(Hinweis:
Rebuild Project
Erstellen derDaggerApplicationComponent
Builder-Klasse mit APT)5.) Erstelle deine
CustomApplication
Klasse6.)
CustomApplication
zu Ihrem hinzufügenAndroidManifest.xml
.7.) Injizieren Sie Ihre Klassen in
MainActivity
8.) Viel Spaß!
+1.) Sie können
Scope
für Ihre Komponenten angeben, mit denen Sie Komponenten mit Aktivitätsbereich erstellen können . Mit Unterbereichen können Sie Abhängigkeiten bereitstellen, die Sie nur für einen bestimmten Unterbereich und nicht für die gesamte Anwendung benötigen. In der Regel erhält jede Aktivität mit diesem Setup ein eigenes Modul. Beachten Sie, dass pro Komponente ein Anbieter mit Gültigkeitsbereich vorhanden ist. Um die Instanz für diese Aktivität beizubehalten, muss die Komponente selbst die Konfigurationsänderung überstehen. Zum Beispiel könnte es durch überlebenonRetainCustomNonConfigurationInstance()
oder ein Mörserfernrohr.Weitere Informationen zum Subscoping finden Sie in der Anleitung von Google . Auch finden Sie diese Seite über Bereitstellung Methoden und auch die Komponentenabhängigkeiten Abschnitt ) und hier .
Um einen benutzerdefinierten Bereich zu erstellen, müssen Sie die Anmerkung zum Bereichsqualifizierer angeben:
Um einen Unterbereich zu erstellen, müssen Sie den Bereich für Ihre Komponente angeben und
ApplicationComponent
als Abhängigkeit angeben . Natürlich müssen Sie den Unterbereich auch in den Modulanbietermethoden angeben.Und
Bitte beachten Sie, dass nur eine Komponente mit Gültigkeitsbereich als Abhängigkeit angegeben werden kann. Stellen Sie sich das genau so vor, wie Mehrfachvererbung in Java nicht unterstützt wird.
+2.) Info
@Subcomponent
: Im Wesentlichen kann ein Gültigkeitsbereich@Subcomponent
eine Komponentenabhängigkeit ersetzen. Anstatt jedoch einen vom Anmerkungsprozessor bereitgestellten Builder zu verwenden, müssten Sie eine Komponentenfactory-Methode verwenden.Also das:
Wird dies:
Und das:
Wird dies:
+3.): Bitte überprüfen Sie auch andere Fragen zum Stapelüberlauf in Bezug auf Dagger2. Sie enthalten viele Informationen. Zum Beispiel ist meine aktuelle Dagger2-Struktur in dieser Antwort angegeben .
Vielen Dank
Vielen Dank für die Anleitungen bei Github , TutsPlus , Joe Steele , Froger MCS und Google .
Auch für diese Schritt-für-Schritt-Anleitung zur Migration habe ich nach dem Schreiben dieses Beitrags gefunden.
Und zur Erklärung des Umfangs durch Kirill.
Noch mehr Informationen in der offiziellen Dokumentation .
quelle
DaggerApplicationComponent
wird von APT beim Erstellen automatisch generiert , aber ich werde es hinzufügen.Anleitung für Dolch 1.x :
Die Schritte sind die folgenden:
1.)
Dagger
Zurbuild.gradle
Datei für die Abhängigkeiten hinzufügenFügen Sie außerdem hinzu
packaging-option
, um einen Fehler zu vermeidenduplicate APKs
.2.) Erstellen Sie eine
Injector
Klasse, um die zu behandelnObjectGraph
.3.) Erstellen Sie eine
RootModule
, um Ihre zukünftigen Module miteinander zu verknüpfen. Bitte beachten Sie, dass Sieinjects
angeben müssen , um jede Klasse anzugeben, in der Sie@Inject
Anmerkungen verwenden, da sonst Dagger wirftRuntimeException
.4.) Wenn Sie andere Untermodule in Ihren Modulen haben, die in Ihrem Root angegeben sind, erstellen Sie Module für diese:
5.) Erstellen Sie die Blattmodule, die die Abhängigkeiten als Konstruktorparameter erhalten. In meinem Fall gab es keine zirkuläre Abhängigkeit, daher weiß ich nicht, ob Dagger das lösen kann, aber ich finde es unwahrscheinlich. Die Konstruktorparameter müssen auch in einem Modul von Dagger bereitgestellt werden. Wenn Sie dies angeben
complete = false
, können sie auch in anderen Modulen enthalten sein.6.) Erweitern
Application
und initialisieren Sie dieInjector
.7.)
MainActivity
Rufen Sie in Ihrem den Injector in deronCreate()
Methode auf.8.) Verwenden Sie
@Inject
in IhremMainActivity
.Wenn Sie den Fehler erhalten
no injectable constructor found
, stellen Sie sicher, dass Sie die@Provides
Anmerkungen nicht vergessen haben .quelle
Android Bootstrap
. Also, danke ihnen dafür, dass sie es herausgefunden haben. Lösung verwendetDagger v1.2.2
.dagger-compiler
sollte sein,provided
sonst wird es in die Anwendung aufgenommen und steht unter der GPL-Lizenz.