2016-08-16 39 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

如果你可以在这里添加代码,这将是很好的。因为子组件的官方文档和示例太难理解了 –

相关问题