Java 如何避免设置所有组件';在活动中插入模块以使用Dagger 2注入依赖项?

Java 如何避免设置所有组件';在活动中插入模块以使用Dagger 2注入依赖项?,java,android,dependency-injection,dagger-2,dagger,Java,Android,Dependency Injection,Dagger 2,Dagger,我使用Dagger2注入依赖项和MVP作为我的应用程序设计模式 我有两个活动(main活动和LoginActivity)。每个模块分别实现一个接口(MainView和LoginView),并具有一个相关模块(LoginModule和MainModule)。另一方面,我有一个main组件,它使用两个模块。问题如下: 如果我试图在MainActivity中注入依赖项,我只需要MainModule,而不是LoginModule,而是main组件使用其图中的两个模块。因此,我必须设置两个模块(如果我错了

我使用Dagger2注入依赖项和MVP作为我的应用程序设计模式

我有两个活动(
main活动
LoginActivity
)。每个模块分别实现一个接口(
MainView
LoginView
),并具有一个相关模块(
LoginModule
MainModule
)。另一方面,我有一个
main组件
,它使用两个模块。问题如下: 如果我试图在
MainActivity
中注入依赖项,我只需要
MainModule
,而不是
LoginModule
,而是
main组件
使用其图中的两个模块。因此,我必须设置两个模块(如果我错了,请纠正我),应该是这样的:

public void setupComponent(MyApplicationComponent appComponent){
   DaggerMainComponent.builder()
       .myApplicationComponent(appComponent)
       .mainModule(new MainModule(this))
       .loginModule(new LoginModule(???))
       .build.inject(this);
}
当我在
MainActivity
中注入依赖项时,我只需要设置
MainModule
LoginActivity
中的
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;
    }
}
正如您所看到的
main模块
LoginModule
,它们的构造函数中都有一个参数(
MainView
LoginView
)。所以知道
MainActivity
实现了
MainView
LoginModule
实现了
LoginView
,如果我在
MainActivity
中并且我想注入依赖项,我需要像这样设置
MainModule
:MainModule(新的MainModule(this)).build.inject(this)。但是
LoginModule
呢?如何避免在此活动中设置它,而不必将其从
MainComponent
的模块中删除?或者如何设置它(我不能在
.loginModule(新的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和一个Main组件,然后将它们作为子组件添加到MyApplicationComponent中

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

    void inject(Application application);

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

}
////

////

然后注入你的活动

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

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

如果
MainActivity
实现了
MainView
,为什么需要将
MainView
的实例注入
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)
}