所以我有一个ApplicationComponent用于将单例注入到我的片段和演示者中,但我正在尝试创建一个组件以注入AppComponent所做的同一个演示者.沿着这些方向的东西.
@H_301_5@解决方法
- @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);
- }
- ...
- }
对于任何无法解决这个问题的人来说,一个组件必须为对象提供所有依赖关系.所以在我的情况下,我必须使FileManagerComponent成为一个子组件,并将“.plus()”与我的AppComponent一起使用,或者让它依赖于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);
- }
你会像这样使用它(在MyFileManagingActivity中):
- 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);
- }
现在,您必须构建依赖于app组件的组件.
- FileManagerComponent fmc = DaggerFileManagerComponent.builder()
- .applicationComponent(appComponent)
- .fileManagerModule(new FileManagerModule())
- .build();
- fmc.inject(this);