2016-05-04 2 views
0

Ich arbeite an Dolch 2 und traf mit einer Abhängigkeit Injektion Problem. Ich werde dir eine Idee zu dem Problem geben. Ich habe eine ApplicationComponent wie unten gezeigt.Dolch 2 Problem mit Sub-Komponente und eine Komponente mit einer Abhängigkeitskomponente

@Singleton 
@Component(modules = {AppModule.class, MySubComponent.class}) 
public interface ApplicationComponent { 
    void inject(Application app); 
    List<Integer> pattern; 
    MySubComponent subcomponent(); 
} 

Wie Sie sehen können, habe ich eine Unterkomponente in der oben genannten Komponente definiert.

ApplicationComponent comp = DaggerApplicationComponent.builder() 
       .appModule(new ApplicationModule()) 
       .mySubModule(new MySubModule()) 
       .build(); 

So habe ich eine Anwendungskomponenteninstanz erstellt.

Hier ist die Subkomponente

@Singleton 
@Subcomponent(modules = MySubModule.class) 
public interface MySubComponent { 
    void inject(AClass obj); 

    INeedThis ineedthis(); 
} 

@Module 
public class MySubComponent { 
    @Provides 
    @Singleton 
    INeedThis provideINeedThis() { 
     return new INeedThis(); 
    } 
} 

ich dann eine andere Komponente erstellt, LoginComponent mit ApplicationComponent als Abhängigkeit

@Scope 
@Retention(RetentionPolicy.RUNTIME) 
public @interface PerActivity{} 

@PerActivity 
@Component(dependencies = ApplicationComponent.class, modules = LoginModule.class) 
public interface LoginComponent { 
    void inject(FirstActivity activity); 
} 

I wie unten LoginComponent Instanz erstellt.

Das Problem tritt auf, wenn ich INeedThis-Objekt in FirstActivity injiziere. Meine Annahme ist, da LoginComponent eine Abhängigkeit von ApplicationComponent hat, die eine Unterkomponente MySubComponent hat, INeedThis-Objekt sollte injiziert werden. Aber in Wirklichkeit versäumt es das und ich bekomme den folgenden Fehler.

Ich habe viele Beiträge zu Unterkomponenten auf Dolch 2 gelesen. Sie funktionierten jedoch nicht wie erwartet. Gibt es etwas, das ich vermisse?

Antwort

3

Zuerst verwenden Sie keine Unterkomponenten im obigen Code und dieses Problem ist nicht mit ihnen verwandt, aber das ist ein anderes Problem.

Ihre LoginComponenthängt auf ApplicationComponent wie folgt deklariert:

@Component(dependencies = ApplicationComponent.class, modules = LoginModule.class) 
public interface LoginComponent {} 

Was dies bedeutet, ist, dass mit Ihrer LoginComponent Sie alles injizieren, die die LoginComponent kennt. Das ist alles von , mögliche Objekte, die von Konstruktor Injektion * und ausgesetzt Objekte von Ihrem ApplicationComponent erstellt werden können.

INeedDies kann nicht ohne @ Provided- oder @ Producens-Annotated-Methoden bereitgestellt werden.

Das sagt, dass für INeedThis keiner von denen wahr ist.

@Component(modules = {AppModule.class, MySubComponent.class}) 

Ich weiß nicht, wie/warum Sie als Modul eine Komponente hinzuzufügen.Wenn dies ein Tippfehler ist, und fügen Sie MySubModule Ihrer Komponente würden Sie nur die folgenden aussetzenINeedThis hinzufügen:

@Component(modules = {AppModule.class, MySubModule.class}) 
public interface ApplicationComponent { 
    //... 
    INeedThis getINeedThis(); 
} 

Ist dies nicht ein Tippfehler ist, und Sie möchten eigentlich ein verwenden, Subkomponente, dann sollte Ihre LoginComponent von der tatsächlichen Unterkomponente abhängen, aber es würde auf die gleiche Weise funktionieren, sobald Sie Ihren Code beheben, um tatsächlich Unterkomponenten zu verwenden.

über Ihre Subkomponente Definition gegeben, würden Sie Ihre App-Komponente die Komponente als Modul nicht Liste ändern, und fügen Sie eine Methode, um erweitern Ihre ApplicationComponent:

@Singleton 
@Component(modules = {AppModule.class}) // removed from modules 
public interface ApplicationComponent { 
    void inject(Application app); 
    List<Integer> pattern; 
    MySubComponent subcomponent(); // this will create your subcomponent 

    // same as above 
    // MySubComponent subcomponent(MySubModule module); use this if you also need to setup your module 
} 

Dann würden Sie Ihre erstellen Subkomponente wie folgt aus:

AppComponent appComponent = DaggerAppcomponent.create(); 
MySubComponent subComponent = appComponent.subcomponent(); // call the method on your app component 

Dann, wenn Sie Ihre LoginComponent wie folgt ändern:

@Component(dependencies = MySubComponent.class, modules = LoginModule.class) 
public interface LoginComponent { /**/ } 

Sie können es dann schaffen wie

DaggerLoginComponent.builder().loginModule(new LoginModule().mySubComponent(subComponent).build(); 

Und die gleichen wie oben, erhalten Sie einen getINeedThis() auf Ihre MySubComponent Schnittstelle zu aussetzen das Objekt in das Unter Diagramm hinzufügen.

+0

Die Idee der Einrichtung einer Unterkomponente ist schwer zu verstehen. Kannst du mir bitte sagen, wie man eine Unterkomponente einstellt? Im Grunde brauche ich eine ApplicationComponent mit einer Unterkomponente. Alle anderen Komponenten mit ApplicationComponent als Abhängigkeit sollten Zugriff auf die Unterkomponente haben. Korrigiere mich, wenn das nicht die Norm ist! – Renjith

+1

@Renjith Bitte beachten Sie, dass diese Seite für spezielle Programmierfragen und nicht allgemeine Kodierungsinformationen ist. Wie oder warum Sie eine Unterkomponente verwenden müssen, hängt davon ab, was Sie erreichen möchten, und ich kann dies nicht für Sie beantworten. Ich habe die Antwort aktualisiert, wenn Sie noch weitere Informationen benötigen, sollten Sie nach einigen tatsächlichen Tutorials suchen und versuchen Sie ein bisschen selbst –

+0

Danke für Ihre bearbeitete Antwort! Ich habe versucht, es in meine App zu integrieren, aber es hat nicht funktioniert. Vielleicht, was ich erreichen möchte, könnte etwas anders sein. Ich habe jedoch einige der Github-Samples gründlich untersucht und zum Laufen gebracht. – Renjith