如何避免将所有组件的模块设置为 activity 以注入 Dagger 2 的依赖项?

How can I avoid to set all my component's modules in an activity to inject dependencies with Dagger 2?

我正在使用 Dagger 2 注入依赖项和 MVP 作为我的应用程序设计模式。

我有 2 个活动(MainActivityLoginActivity)。每个都实现一个接口(分别为 MainViewLoginView)并有一个关联的模块(LoginModuleMainModule)。另一方面,我有一个使用 2 个模块的 MainComponent。问题如下: 如果我试图在 MainActivity 中注入依赖项,我只需要 MainModule,而不是 LoginModule,但是 MainComponent 使用他图中的 2 个模块。所以,我必须设置2个模块(如果我错了请纠正我),它应该是这样的:

public void setupComponent(MyApplicationComponent appComponent){
   DaggerMainComponent.builder()
       .myApplicationComponent(appComponent)
       .mainModule(new MainModule(this))
       .loginModule(new LoginModule(???))
       .build.inject(this);
}

当我在 MainActivity 中注入依赖项时,我只需要设置 MainModuleLoginActivity 中的 LoginModule,而不是两者。我该怎么做?

登录模块:

@Module
public class LoginModule {

    private LoginView loginView;

    public LoginModule(LoginView view) {
        loginView = view;
    }

    @Provides
    public LoginView provideLoginView() {
        return loginView;
    }

主模块:

@Module
public class MainModule {
    private MainView mainView;

    public MainModule(MainView mainView){
        this.mainView=mainView;
    }

    @Provides MainView provideMainView(){
        return mainView;
    }
}

如您所见,MainModuleLoginModule,它们的构造函数中都有一个参数(MainViewLoginView)。所以知道 MainActivity 实现 MainViewLoginModule 实现 LoginView,如果我在 MainActivity 并且我想注入依赖项,我需要设置 MainModule 像这样:.mainModule(new MainModule(this)).build.inject(this)。但是 LoginModule 呢?我怎样才能避免在 activity 中设置它而不必将其从 MainComponent 的模块中删除?或者我该如何设置它(我不能在 .loginModule(new LoginModule(this)) 中使用 "THIS" 因为 MainActivity 实现了 MainView 而不是 LoginView)?

主要组件:

@ActivityScope
@Component(
        dependencies = MyApplicationComponent.class,
        modules = {LoginModule.class, MainModule.class}
)

public interface MainComponent {
    void inject(LoginActivity loginActivity);
    void inject(MainActivity mainActivity);
    LoginPresenterImp getLoginPresenter();
    MainPresenterImp getMainPresenter():
}

提前致谢。

LoginModule 和 MainModule 应该有自己的组件。

我建议创建一个 LoginComponent 和一个 MainComponent,然后将它们作为子组件添加到 MyApplicationComponent。

@ApplicationScope
@Component(
    modules = {ApplicationModule.class})
public interface ApplicationComponent {

    void inject(Application application);

    MainComponent plus(MainModule mainModule);
    LoginComponent plus(LoginModule loginModule);

}

////

@ActivityScope
@Subcomponent(
    modules = {
            MainModule.class,
    }
)
public interface MainComponent {

    void inject(MainActivity mainActivity);

}

////

@ActivityScope
@Subcomponent(
    modules = {
            LoginModule.class,
    }
)
public interface LoginComponent {

    void inject(LoginActivity loginActivity);

}

然后注入您的活动

public void setupComponent(ApplicationComponent appComponent){
appComponent.plus(new MainModule(this)).inject(this)
}

public void setupComponent(ApplicationComponent appComponent){
appComponent.plus(new LoginModule(this)).inject(this)
}