Comment utiliser Dagger? Comment configurer Dagger pour qu'il fonctionne dans mon projet Android?
J'aimerais utiliser Dagger dans mon projet Android, mais je trouve cela déroutant.
EDIT: Dagger2 est également sorti depuis 2015 04 15, et c'est encore plus déroutant!
[Cette question est un «talon» sur lequel j'ajoute à ma réponse au fur et à mesure que j'en apprends plus sur Dagger1 et que j'en apprends plus sur Dagger2. Cette question est plus un guide qu'une "question".]
android
dependency-injection
dagger
dagger-2
EpicPandaForce
la source
la source
ViewModel
etPageKeyedDataSource
? Comme j'utilise RxJava2, et je veux que CompositeDisposable soit partagé par les deux classes et si l'utilisateur appuie sur le bouton retour, je veux effacer l'objet jetable. J'ai ajouté un cas ici: stackoverflow.com/questions/62595956/…ViewModel
et peut-être de passer le même compositeDisposable en tant qu'argument constructeur de votre PageKeyedDataSource personnalisée, mais je n'utiliserais pas vraiment Dagger pour cette partie parce que vous avez alors besoin de sous-composants sous-cadrés, et Hilt ne le supportera pas vraiment. facile pour toi.Réponses:
Guide pour Dagger 2.x (édition révisée 6) :
Les étapes sont les suivantes:
1.) ajoutez
Dagger
à vosbuild.gradle
fichiers:.
.
2.) Créez votre
AppContextModule
classe qui fournit les dépendances.3.) créez la
AppContextComponent
classe qui fournit l'interface pour obtenir les classes injectables.3.1.) Voici comment créer un module avec une implémentation:
Attention: vous devez fournir l'
@Scope
annotation (comme@Singleton
ou@ActivityScope
) sur la@Provides
méthode annotée du module pour obtenir un fournisseur de portée dans votre composant généré, sinon il sera sans portée, et vous obtiendrez une nouvelle instance à chaque fois que vous injecterez.3.2.) Créez un composant d'application qui spécifie ce que vous pouvez injecter (c'est le même que celui
injects={MainActivity.class}
de Dagger 1.x):3.3.) Pour les dépendances que vous pouvez créer vous-même via un constructeur et que vous ne voudrez pas redéfinir en utilisant a
@Module
(par exemple, vous utilisez plutôt des versions de build pour changer le type d'implémentation), vous pouvez utiliser un@Inject
constructeur annoté.De plus, si vous utilisez un
@Inject
constructeur, vous pouvez utiliser l'injection de champ sans avoir à appeler explicitementcomponent.inject(this)
:Ces
@Inject
classes de constructeur sont automatiquement ajoutées au composant de même portée sans avoir à les spécifier explicitement dans un module.Une classe de constructeur à
@Singleton
portée@Inject
sera vue dans les@Singleton
composants à portée.3.4.) Après avoir défini une implémentation spécifique pour une interface donnée, comme ceci:
Vous devrez "lier" l'implémentation spécifique à l'interface avec un fichier
@Module
.Un raccourci pour cela depuis Dagger 2.4 est le suivant:
4.) créez une
Injector
classe pour gérer votre composant au niveau de l'application (il remplace le monolithiqueObjectGraph
)(note:
Rebuild Project
pour créer laDaggerApplicationComponent
classe de générateur en utilisant APT)5.) créez votre
CustomApplication
classe6.) ajoutez
CustomApplication
à votreAndroidManifest.xml
.7.) Injectez vos classes dans
MainActivity
8.) Profitez-en!
+1.) Vous pouvez spécifier
Scope
pour vos composants avec lesquels vous pouvez créer des composants étendus au niveau de l'activité . Les sous-étendues vous permettent de fournir des dépendances dont vous n'avez besoin que pour une sous-étendue donnée, plutôt que dans toute l'application. En règle générale, chaque activité possède son propre module avec cette configuration. Veuillez noter qu'un fournisseur de portée existe par composant , ce qui signifie que pour conserver l'instance pour cette activité, le composant lui-même doit survivre au changement de configuration. Par exemple, il pourrait survivre à traversonRetainCustomNonConfigurationInstance()
, ou une lunette de mortier.Pour plus d'informations sur le sous-champ, consultez le guide de Google . Veuillez également consulter ce site sur les méthodes de mise à disposition ainsi que la section sur les dépendances des composants ) et ici .
Pour créer une étendue personnalisée, vous devez spécifier l'annotation du qualificatif d'étendue:
Pour créer une sous-étendue, vous devez spécifier la portée de votre composant et la spécifier
ApplicationComponent
comme sa dépendance. De toute évidence, vous devez également spécifier la sous-étendue sur les méthodes du fournisseur de module.Et
S'il vous plaît noter que seule une composante scope peut être spécifié comme une dépendance. Pensez-y exactement comme l'héritage multiple n'est pas pris en charge en Java.
+2.) A propos
@Subcomponent
: essentiellement, une portée@Subcomponent
peut remplacer une dépendance de composant; mais plutôt que d'utiliser un générateur fourni par le processeur d'annotations, vous devrez utiliser une méthode de fabrique de composants.Donc ça:
Devient ceci:
Et ça:
Devient ceci:
+3.): Veuillez vérifier également les autres questions de Stack Overflow concernant Dagger2, elles fournissent beaucoup d'informations. Par exemple, ma structure Dagger2 actuelle est spécifiée dans cette réponse .
Merci
Merci pour les guides de Github , TutsPlus , Joe Steele , Froger MCS et Google .
Aussi pour ce guide de migration étape par étape, j'ai trouvé après avoir écrit ce post.
Et pour l' explication de la portée par Kirill.
Encore plus d'informations dans la documentation officielle .
la source
DaggerApplicationComponent
est généré automatiquement par APT lors de la construction, mais je vais l'ajouter.Guide pour Dagger 1.x :
Les étapes sont les suivantes:
1.) ajouter
Dagger
aubuild.gradle
fichier pour les dépendancesAjoutez également
packaging-option
pour éviter une erreur surduplicate APKs
.2.) créez une
Injector
classe pour gérer le fichierObjectGraph
.3.) Créez un
RootModule
pour relier vos futurs modules entre eux. Veuillez noter que vous devez inclureinjects
pour spécifier chaque classe dans laquelle vous utiliserez l'@Inject
annotation, car sinon Dagger lanceRuntimeException
.4.) Si vous avez d'autres sous-modules dans vos modules spécifiés dans votre racine, créez des modules pour ceux-ci:
5.) créez les modules feuilles qui reçoivent les dépendances en tant que paramètres de constructeur. Dans mon cas, il n'y avait pas de dépendance circulaire, donc je ne sais pas si Dagger peut résoudre cela, mais je trouve cela peu probable. Les paramètres du constructeur doivent également être fournis dans un module par Dagger, si vous spécifiez,
complete = false
cela peut également être dans d'autres modules.6.) Étendez
Application
et initialisez le fichierInjector
.7.) Dans votre
MainActivity
, appelez l'injecteur dans laonCreate()
méthode.8.) Utilisez
@Inject
dans votreMainActivity
.Si vous obtenez l'erreur
no injectable constructor found
, assurez-vous de ne pas oublier les@Provides
annotations.la source
Android Bootstrap
. Alors, merci à eux de l'avoir compris. La solution utiliseDagger v1.2.2
.dagger-compiler
devrait êtreprovided
sinon elle sera incluse dans l'application, et c'est sous licence GPL.