gpt4 book ai didi

java - 如何避免在 Activity 中设置我所有组件的模块以注入(inject) Dagger 2 的依赖项?

转载 作者:行者123 更新时间:2023-11-30 00:48:53 26 4
gpt4 key购买 nike

我使用 Dagger 2 来注入(inject)依赖项和 MVP 作为我的应用程序设计模式。

我有 2 个 Activity (MainActivityLoginActivity)。每一个都实现了一个接口(interface)(分别是 MainViewLoginView)并有一个关联的模块(LoginModuleMainModule)。另一方面,我有一个使用 2 个模块的 MainComponent。问题如下:如果我试图在 MainActivity 中注入(inject)依赖项,我只需要 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 中注入(inject)依赖项时,我只需要设置 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;
}
}

如您所见,MainModuleLoginModule 在它们的构造函数中都有一个参数(MainViewLoginView ).所以知道 MainActivity 实现了 MainView 并且 LoginModule 实现了 LoginView,如果我在 MainActivity 并且我想注入(inject)依赖项 我需要像这样设置 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);

}

然后注入(inject)你的 Activity

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

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

关于java - 如何避免在 Activity 中设置我所有组件的模块以注入(inject) Dagger 2 的依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41370535/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com