Ich verwende Dagger 2, um Abhängigkeiten und MVP als mein Anwendungsdesignmuster zu injizieren.Wie kann ich vermeiden, alle Module meiner Komponente in eine Aktivität zu setzen, um Abhängigkeiten mit Dagger 2 zu injizieren?
Ich habe 2 Aktivitäten (MainActivity
und LoginActivity
). Jeder implementiert eine Schnittstelle (MainView
und LoginView
respektvoll) und ein zugeordnetes Modul (LoginModule
und MainModule
). Auf der anderen Seite habe ich eine MainComponent
, die die 2 Module verwendet. Das Problem ist folgendes: Wenn ich versuche, Abhängigkeiten in MainActivity
zu injizieren, brauche ich nur die MainModule
, nicht die LoginModule
, aber die MainComponent
nutzt die 2 Module in seinem Diagramm. Also, ich habe die zwei Module setzen (korrigieren Sie mich, wenn ich falsch liege), sollte es so etwas wie dieses:
public void setupComponent(MyApplicationComponent appComponent){
DaggerMainComponent.builder()
.myApplicationComponent(appComponent)
.mainModule(new MainModule(this))
.loginModule(new LoginModule(???))
.build.inject(this);
}
Wenn ich Abhängigkeiten in MainActivity
injizieren Ich muss nur die MainModule
gesetzt und in LoginActivity
der LoginModule
, nicht beides. Wie kann ich es tun?
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;
}
}
Wie Sie MainModule
und LoginModule
sehen können, beide haben einen Parameter in ihren Konstrukteuren (MainView
und LoginView
). Also wissend, dass MainActivity
implementiert MainView
und LoginModule
implementiert LoginView
, Wenn ich in MainActivity
bin und ich Abhängigkeiten injizieren möchte, muss ich setzen MainModule
wie folgt: .mainModule(new MainModule(this)).build.inject(this)
. Aber was ist mit LoginModule
? Wie kann ich vermeiden, es in dieser Aktivität zu setzen, ohne es aus den Modulen MainComponent
zu entfernen? oder wie kann ich es einstellen (ich kann nicht "THIS" in .loginModule(new LoginModule(this))
wegen MainActivity
implementiert MainView
aber nicht LoginView
)?
MainComponent:
@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():
}
Vielen Dank im Voraus.
spritzen Wenn '' MainActivity' implementiert MainView', warum Müssen Sie eine Instanz von 'MainView' in' MainActivity' einfügen? – benji