2016-08-16 70 views
5

因此,我有一個ApplicationComponent用於將單例注入到我的片段和演示者中,但我試圖創建一個組件以注入到AppComponent的同一個演示者確實。沿着這些線路的東西。如何使用Dagger 2將多個組件注入到同一個對象中

@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

此問題已被多次詢問,組件必須提供_all_字段,否則它將無法工作。您不能混用和匹配組件。例如檢查在這裏:http://stackoverflow.com/a/38897722/1837367 –

+0

@DavidMedenjak那麼如果AppComponent正在構建應用程序創建時,並且沒有活動上下文,我怎麼能給FileManagerModule一個活動上下文? – Stampede10343

回答

6

對於任何人無法弄清楚這一點,一個組件必須提供對象的所有依賴關係。所以在我的情況下,我必須使FileManagerComponent是一個子組件,並使用我的AppComponent「.plus()」,或者使其依賴於AppComponent,並讓AppComponent通過擁有一個Context context();方法將下游暴露給Context,該方法將讓依賴它的組件可以訪問它所具有的上下文。

例如:

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

而且你會使用它像這樣(在M​​yFileManagingActivity):

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

或者,如果你不想使用子是這樣的:

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

現在,您必須構建依賴於應用程序組件的組件。

​​
+2

請添加一些代碼 –

+0

如果你可以在這裏添加代碼,這將是很好的。因爲子組件的官方文檔和示例太難理解了 –

相關問題