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

我有2个活动(MainActivityLoginActivity)。每个接口都实现一个接口(分别为MainViewLoginView)并具有一个关联的模块(LoginModuleMainModule)。另一方面,我有一个使用两个模块的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中的一个,而不是两者都设置。我该怎么做?

LoginModule:

@Module
public class LoginModule {

    private LoginView loginView;

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

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


MainModule:

@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呢?如何避免在本活动中设置它而不必从MainComponent的模块中删除它?或如何设置它(由于.loginModule(new LoginModule(this))实现了MainActivity但不能使用MainView,所以不能在LoginView中使用“ THIS”)?

主要成分:

@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)
}

10-07 18:12