Dans mon module, dans ma classe d'application de base
component = DaggerCompClassComponent.builder()
.classModule(new ModuleClass()).build();
il ne peut pas trouver DaggerCompClassComponent.
J'ai le module build.gradle
apply plugin: 'com.neenbedankt.Android-apt'
.........................
apt 'com.google.dagger:dagger-compiler:2.8'
compile 'com.google.dagger:dagger:2.8'
provided 'javax.annotation:jsr250-api:1.0'
et dans le projet build.gradle,
classpath 'com.neenbedankt.gradle.plugins:Android-apt:1.8'
J'ai fait construire/reconstruire/nettoyer/redémarrer le projet. J'ai une classe Component où j'injecte des objets et une ModuleClass où je fournis des objets à injecter.
Quelle peut être la cause pour ne pas générer de composant de poignard. classe?
MODIFIER:
Ceci est mon ModuleClass, avec @Module:
@Provides
@Singleton
public Interceptor provideInterceptor() {
return new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request.Builder builder = chain.request().newBuilder();
builder.addHeader("AppName-Android", BuildConfig.VERSION_NAME + "-" + BuildConfig.VERSION_CODE)
.addHeader("Content-Type", "application/json");
return chain.proceed(builder.build());
}
};
}
@Provides
@Singleton
OkHttpClient provideOkHttpClient(Interceptor interceptor) {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.interceptors().add(interceptor);
return builder.build();
}
@Provides
@Singleton
Retrofit provideRetrofit(OkHttpClient client) {
return new Retrofit.Builder()
.baseUrl(BaseApplication.getRes().getString(R.string.api_base_url))
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
}
@Provides
@Singleton
WebServiceCall provideWebService(Retrofit retrofit) {
return retrofit.create(WebServiceCall.class);
}
Et voici ma classe de composants:
@Component(modules = ModuleClass.class)
@Singleton
public interface ComponentClass {
void inject(Interceptor o);
void inject(OkHttpClient o);
void inject(Retrofit o);
void inject(WebServiceCall o);
}
Lors du développement sur Kotlin, vous devez ajouter les lignes suivantes à côté de leurs contreparties annotationProcessor
:
kapt 'com.google.dagger:dagger-Android-processor:2.15'
kapt 'com.google.dagger:dagger-compiler:2.15'
et ajouter apply plugin: 'kotlin-kapt'
au début du même fichier.
Cette section ressemble à ceci pour moi:
apply plugin: 'com.Android.application'
apply plugin: 'kotlin-Android'
apply plugin: 'kotlin-kapt' // <- Add this line
apply plugin: 'io.fabric'
Voici la solution pour le nouveau projet Dagger.
Ces deux lignes sont responsables de la génération du framework de compilation dans Dagger 2.
compile 'com.google.dagger:dagger:2.14.1'
// génère le framework au moment de la compilation annotationProcessor 'com.google.dagger:dagger-compiler:2.14.1'
// génère la structure au moment de la compilation en fonction des annotations fournies.
Dague d'installation complète
//dagger 2
compile 'com.google.dagger:dagger:2.14.1'
annotationProcessor 'com.google.dagger:dagger-compiler:2.14.1'
//to enable DaggerActivity, DaggerBroadcastReceiver, DaggerFragment etc classes
compile 'com.google.dagger:dagger-Android:2.14.1'
annotationProcessor 'com.google.dagger:dagger-Android-processor:2.14.1'
//support libraries with dagger 2
compile 'com.google.dagger:dagger-Android-support:2.14.1'
Remarque : Vous devez configurer le processus d'annotation comme indiqué dans la capture d'écran ci-dessous. Tu peux le faire File>Other Settings>Default Settings>
chercher"Annotation processor"
Peut-être avez-vous oublié d'annoter ModuleClass avec @Module?
Il y a quelques idées fausses/défauts mineurs dans votre code ci-dessus, voici une implémentation qui fonctionne:
Application.Java:
component = DaggerComponentClass.builder().classModule(new ModuleClass()).build();
La classe générée sera nommée DaggerComponentClass
et non pas DaggerCompClassComponent
. Si vous ne pouvez pas exécuter votre application dans Android Studio pour la construire, essayez Construire-> Nettoyer le projet et Construire-> Reconstruire le projet dans le menu. Si tout est correct, Dagger aura compilé DaggerComponentClass
qui sera situé dans le même paquet que ComponentClass
.
ComponentClass.Java:
@Component(modules = ModuleClass.class)
public interface ComponentClass {
void inject(AClassThatShouldGetInstancesInjected instance);
}
Un composant dans Dagger2 a des méthodes nommées inject
qui reçoivent l'instance dans laquelle les instances sont injectées, et non l'inverse. Dans le code ci-dessus, la classe AClassThatShouldGetInstancesInjected
appellera généralement componentClass.inject(this);
pour obtenir des instances injectées en elle-même.
ModuleClass.Java:
@Module
public class ModuleClass {
@Provides
@Singleton
public Interceptor provideInterceptor() {/*code*/}
//Your Providers...
}
Le module est correct dans votre code, assurez-vous qu’il est annoté.
Dans l'application de build.gradle, vous devez ajouter les dépendances nécessaires à Dagger pour générer les classes correspondantes, comme ci-dessous:
implementation 'com.google.dagger:dagger-Android:2.21'
implementation 'com.google.dagger:dagger-Android-support:2.21' // if you use the support libraries
annotationProcessor 'com.google.dagger:dagger-Android-processor:2.21'
annotationProcessor 'com.google.dagger:dagger-compiler:2.21'
vous devriez changer la version du poignard que vous utilisez.
référez-vous au document de poignard complet dans this
Si vous avez plusieurs modules dans votre AndroidStudio (modules en termes de Android Studio, pas Dagger), une autre raison possible d'échec est que vous avez oublié de mettre des processeurs d'annotation dans les [build.gradle
.
Nous avons divisé notre application en plusieurs modules. Nous avons mis à jour des dépendances entre implementation
et api
, mais nous avons oublié de gérer les processeurs d'annotation en conséquence.
Donc, vous ne pouvez avoir ces lignes que dans un module racine:
api 'com.google.dagger:dagger-Android:2.16'
// if you use the support libraries
api 'com.google.dagger:dagger-Android-support:2.16'
Mais ceux-ci devraient être spécifiés dans toutes les dépendances des modules:
annotationProcessor 'com.google.dagger:dagger-compiler:2.16'
// if you use injections to Android classes
annotationProcessor 'com.google.dagger:dagger-Android-processor:2.16'
Si vous utilisez Kotlin, veillez à ajouter le plug-in Gradle kapt
(processeur d'annotation Kotlin) à votre script de construction et à utiliser le type de dépendance kapt
à la place de annotationProcessor
pour Dagger Compiler.
apply plugin: 'kotlin-kapt
kapt deps.daggercompiler
implementation deps.dagger
Si Dagger2 ne peut pas générer ses composants, cela signifie que votre code contient des erreurs avec Scopes/Modules. Consultez nos méthodes de votre @ Fournit/Inject.
PD:
Vous devez injecter vos composants dans les cas où vous avez besoin d'instances de classes fournies par module.
comme
inject(MainActivity main);
//add all the dependencies otherwise component class will not be generated.
implementation 'com.google.dagger:dagger-Android:2.21'
implementation 'com.google.dagger:dagger-Android-support:2.21'
annotationProcessor 'com.google.dagger:dagger-Android-processor:2.21'
implementation 'com.google.dagger:dagger:2.21'
annotationProcessor 'com.google.dagger:dagger-compiler:2.21'