我正在使用Dagger 2注入依赖项和MVP作为我的应用程序设计模式。
我有2个活动(MainActivity
和LoginActivity
)。每个接口都实现一个接口(分别为MainView
和LoginView
)并具有一个关联的模块(LoginModule
和MainModule
)。另一方面,我有一个使用两个模块的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
中注入依赖项时,我只需要设置MainModule
和LoginActivity
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;
}
}
如您所见,
MainModule
和LoginModule
都在其构造函数中具有一个参数(MainView
和LoginView
)。因此,知道MainActivity
实现了MainView
和LoginModule
实现了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)
}