Jak już mowa o Presenter znalazłem na dysku przykład:
Na dysku znalazłem przykład z Presenterem
W MainActivity jest coś takiego:
@Inject
ActivityMVP.Presenter presenter;
w onCreate jest:
((App) getApplication()).getComponent().inject(this);
MainActivity implementuje ActivityMVP.View
public interface ActivityMVP {
interface View {
void updateData(ViewModel viewModel);
void showSnackbar(String s);
}
interface Presenter {
void loadData();
}
interface Model {
void result();
}
}
w ApplicationComponent dodany jest AcitivyModule.class a w nim:
@Module
public class ActivityModule {
@Provides
public ActivityMVP.Presenter provideActivityPresenter(ActivityMVP.Model model) {
return new ActivityPresenter(model);
}
@Provides
public ActivityMVP.Model provideActivityModel(Repository repository) {
return new ActivityModel(repository);
}
@Singleton
@Provides
public Repository provideRepo() {
return new ActivityRepository();
}
}
ActivityPresenter wygląda tak:
public class ActivityPresenter implements ActivityMVP.Presenter {
private ActivityMVP.View view;
private ActivityMVP.Model model;
public ActivityPresenter(ActivityMVP.Model model) {
this.model = model;
}
@Override
public void loadData() {
model.result().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<ViewModel>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
if (view != null) {
view.showSnackbar("Error getting");
}
}
@Override
public void onNext(ViewModel viewModel) {
if (view != null) {
view.updateData(viewModel);
}
}
});
}
}
Skąd Dagger wiedział że do provideActivityModel ma dać new ActivityRepository(), a do provideActivityPresenter new ActivityModel(repository)?
Czy jeśli podepnę do applicationComponent kolejny Moduł, a będzie różnił się jedynie provideActivityModel bo będzie np. new ActivityModel2 to jak Dagger to rozpozna?
A co gdybym w ActivityModule usunął provideRepo lub prodiveActivityModel?