2016-08-16 5 views
5

So habe ich eine ApplicationComponent für das Einspritzen von Singletons in meine Fragmente und Presenter, aber ich versuche, eine Komponente zu erstellen, um in den gleichen Präsentator, die AppComponent zu injizieren tut. Etwas in dieser Richtung.Wie kann Dolch 2 verwendet werden, um mehrere Komponenten in das gleiche Objekt zu injizieren

@Component{modules = FileManagerModule.class} 
public interface FileManagerComponet 
{ 
    public void inject(MyPresenter presenter); 
} 

@Component{modules = AppModule.class} 
public interface AppComponent 
{ 
    public void inject(MyPresenter presenter); 
} 

@Module 
public class AppModule 
{ 
    private Context appContext; 
    @Provides 
    @Singleton 
    public SharedPreferences preferences() 
    { 
     return appContext.sharedPreferences(); 
    } 
    ... 
} 

@Module 
public class FileManagerModule 
{ 
    private Context activityContext; 
    @Provides 
    public FileManager FileManager() 
    { 
     return new FileManager(activityContext); 
    } 
    ... 
} 
+2

Diese Frage wurde mehrmals gestellt, eine Komponente muss _all_ der Felder angeben, oder es wird nicht funktionieren. Sie können Komponenten nicht mischen und zuordnen. z.B. prüfe hier: http://stackoverflow.com/a/38897722/1837367 –

+0

@DavidMedenjak Wie kann ich dann dem FileManagerModule einen Aktivitätskontext geben, wenn die AppComponent beim Erstellen der Anwendung erstellt wird und es keinen Aktivitätskontext gibt? – Stampede10343

Antwort

6

Für alle, die das nicht herausfinden können, muss eine Komponente alle Abhängigkeiten zu einem Objekt bereitstellen. In meinem Fall müsste ich also die FileManagerComponent als Subkomponente und ".plus()" mit meiner AppComponent machen oder sie von AppComponent abhängig machen und AppComponent Context downstream freigeben, indem ich eine Context context(); Methode habe, die Komponenten davon abhängen lässt Zugang zu einem Kontext haben.

Zum Beispiel:

@Singleton 
@Component(modules = {NetworkModule.class, AndroidModule.class}) 
public interface ApplicationComponent { 
    FileManagerComponent plus(FileManagerModule module); 
} 

@Subcomponent(modules = {FileManagerModule.class}) 
public interface FileManagerComponent { 
    void injectMyActivity(MyFileManagingActivity activity); 
} 

Und Sie würden es so verwenden (in MyFileManagingActivity):

FileManagerComponent fmc = applicationComponent.plus(new FileManagerModule()); 
fmc.injectMyActivity(this); 

Oder wenn Sie nicht wollen, Subkomponenten, so etwas verwenden:

@Singleton 
@Component(modules = {NetworkModule.class, AndroidModule.class}) 
public interface ApplicationComponent { 
    Context context(); 
    File applicationRootDirectory(); 
} 

// Notice this is ALSO a Component 
@Component(modules = {FileManagerModule.class}, dependencies = ApplicationComponent.class) 
public interface FileManagerComponent { 
    void inject(MyFileManagerActivity activity); 
} 

Jetzt müssen Sie Ihre Komponente erstellen, die von App-Komponente abhängt.

FileManagerComponent fmc = DaggerFileManagerComponent.builder() 
        .applicationComponent(appComponent) 
        .fileManagerModule(new FileManagerModule()) 
        .build(); 
fmc.inject(this); 
+2

fügen Sie bitte einen Code –

+0

hinzu Es wäre großartig, wenn Sie den Code hier hinzufügen könnten. Weil die offiziellen Dokumente und Beispiele für Unterkomponenten zu schwer zu verstehen sind –

Verwandte Themen