如何使用Dagger 2将多个组件注入同一个对象

Sta*_*343 11 mvp android dagger-2

所以我有一个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);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

Sta*_*343 13

对于任何无法解决这个问题的人来说,一个组件必须为对象提供所有依赖关系.所以在我的情况下,我必须使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);
}
Run Code Online (Sandbox Code Playgroud)

你会像这样使用它(在MyFileManagingActivity中):

FileManagerComponent fmc = applicationComponent.plus(new FileManagerModule());
fmc.injectMyActivity(this);
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想使用这样的子组件:

@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);
}
Run Code Online (Sandbox Code Playgroud)

现在,您必须构建依赖于app组件的组件.

FileManagerComponent fmc = DaggerFileManagerComponent.builder()
                   .applicationComponent(appComponent)
                   .fileManagerModule(new FileManagerModule())
                   .build();
fmc.inject(this);
Run Code Online (Sandbox Code Playgroud)

  • 如果您可以在此处添加代码,那就太好了。因为子组件的官方文档和示例太难理解 (2认同)