2017-05-03 5 views
7

In meinem Modul erzeugt wird, in meiner Basis AnwendungsklasseDagger 2 Komponente nicht

component = DaggerCompClassComponent.builder() 
       .classModule(new ModuleClass()).build(); 

es kann nicht DaggerCompClassComponent finden.

Ich habe auf Modul 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' 

und im Projekt build.gradle,

classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' 

Ich habe getan, build/Wiederaufbau/clean/Restart-Projekt. Ich habe eine Component-Klasse, in die ich Objekte injiziere, und eine ModuleClass, in der ich zu injizierende Objekte stelle.

Was kann die Ursache dafür sein, dass Dolch Component nicht generiert wird? Klasse?

EDIT:

Das ist mein ModuleClass, adnotated mit @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); 
} 

Und das ist meine Komponentenklasse:

@Component(modules = ModuleClass.class) 
@Singleton 
public interface ComponentClass { 

    void inject(Interceptor o); 
    void inject(OkHttpClient o); 
    void inject(Retrofit o); 
    void inject(WebServiceCall o); 

} 
+0

Fügen Sie Ihre Komponenten und Module zur Frage –

+0

Die 'void inject (...)' Methoden sind alle falsch, entfernen Sie alle 4 von ihnen – EpicPandaForce

+0

@EpicPandaForce, ich habe gelöscht - keinen Effekt! – hackingforgirls

Antwort

0

Wenn Dagger2 nicht seine Komponenten erzeugen kann, es bedeutet, dass Ihr Code einige Fehler bei Scopes/Modulen hat. Überprüfen Sie unsere @ Provides/Inject-Methoden.

UPD:

Sie sollten Ihre Komponenten in Fällen injizieren, wo Sie Instanzen von Klassen durch Modul benötigen.

wie

inject(MainActivity main); 
+1

@hackingforgirls void inject (Interceptor o); Lücke injizieren (OkHttpClient o); Lücke injizieren (Nachrüstung o); void inject (WebServiceCall o); was ist der Sinn? –

+0

@hackingforgirls sollten Sie Ihre Komponenten in Klassen injizieren, wo Modulinjektionen injiziert werden sollen –

+0

Ich habe die Abhängigkeiten injiziert, die ich in meinem Projekt brauche. Warum sollte ich sie löschen? – hackingforgirls

3

Vielleicht haben Sie vergessen ModuleClass mit @Module zu annotieren?

1

Es gibt einige kleinere Missverständnisse/Störungen im Code oben, hier ist eine funktionierende Implementierung:

Application.java:

component = DaggerComponentClass.builder().classModule(new ModuleClass()).build(); 

Die generierte Klasse wird DaggerComponentClass, nicht DaggerCompClassComponent genannt werden. Wenn Sie Ihre App nicht in Android Studio ausführen können, um sie zu erstellen, versuchen Sie Build-> Projekt bereinigen und Build-> Projekt neu erstellen im Menü. Wenn alles in Ordnung ist, wird Dagger DaggerComponentClass kompiliert haben, das sich im gleichen Paket wie ComponentClass befindet.

ComponentClass.java:

@Component(modules = ModuleClass.class) 
public interface ComponentClass { 
    void inject(AClassThatShouldGetInstancesInjected instance); 
} 

A Komponente in Dagger2 hat Methoden inject genannt, die die Instanz erhalten Instanzen hinein injiziert zu bekommen, nicht umgekehrt. Im obigen Code ruft die Klasse AClassThatShouldGetInstancesInjected normalerweise componentClass.inject(this); auf, um Instanzen in sich selbst zu injizieren.

Modulklasse.java:

@Module 
public class ModuleClass { 
    @Provides 
    @Singleton 
    public Interceptor provideInterceptor() {/*code*/} 

    //Your Providers... 
} 

Die Module im Code korrekt ist, stellen Sie sicher, dass seine Anmerkungen versehen.

+0

'Ich habe @Singleton aus ComponentClass entfernt, da es sich um eine Annotation handelt, die nur für Module relevant ist.'m, nein? – EpicPandaForce

+0

EpicPandaForce Könnte eine falsche Annahme sein, aber von dem, was ich in der Dokumentation gesehen habe @Singleton ist nicht in Komponenten verwendet –

+0

jetzt haben Sie mich tatsächlich unsicher gemacht, aber ich denke, Anwendungsbereich auf der Komponente macht es zu einem "Scoped-Komponente "Dadurch wird es alle' @ Singleton' annotierten Klassen mit '@ Inject'-Konstruktor sehen, und es gibt viele Beispiele, die Sie hier finden können http://Stackoverflow.com/a/40751767/2413303, aber vielleicht auch wir waren alle falsch, haha ​​ – EpicPandaForce

Verwandte Themen