所以我有一个ApplicationComponent用于将单例注入到我的片段和演示者中,但我正在尝试创建一个组件以注入AppComponent所做的同一个演示者.沿着这些方向的东西.
@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);