所以我有一个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);
}
...
}
答案 0 :(得分:13)
对于任何无法解决这个问题的人来说,一个组件必须为对象提供所有依赖关系。所以在我的情况下,我必须使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);
}
你会像这样使用它(在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);