web-dev-qa-db-fra.com

Composant Dague 2 non généré

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);

}
32
ghita

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'
68
Gonzalo

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"enter image description here

25
Uddhav Gautam

Peut-être avez-vous oublié d'annoter ModuleClass avec @Module?

6
Alex Shutov

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é.

3
Pär Nils Amsen

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

2
Mr Special

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'
2
Gaket

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
2
Javad Sadeqzadeh

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);
1
Anton Kazakov
//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'
0
sudhanshu