如何使用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);
    }
    ...
}

对于不明白这一点的人来说,一个组件必须提供对象的所有依赖项。所以在我的情况下,我必须使FileManagerComponent是一个子组件和".plus()"它与我的AppComponent,或者使它依赖于AppComponent和AppComponent暴露上下文下游通过有一个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);

最新更新