Android: внедрить презентатора разницы в активность с помощью Dagger

Предположим, что у Activity есть NavigationView с 3 элементами {временная шкала, профиль, программы}

Итак, у нас есть 3 фрагмента

Я следую шаблону MVP, и у каждого фрагмента есть свой презентер, а для DI я использую Dagger2.

Я хочу ввести каждого докладчика в действие, когда каждый элемент щелкает в представлении навигации.

для каждого докладчика я создаю один модуль и компонент, подобные этому

@Module()
public class FooPresenterModule {

private final FooFragment view;

public FooPresenterModule(FooFragment view) {
    this.view = view;
}

@FragmentScope
@Provides
public FooFragment provideView() {
    return view;
}
 }

и компонент

@FragmentScope
@Component(modules =FooPresenterModule.class)
public interface FooPresenterInjector {

void inject(MainActivity mainActivity);

}

в Activity вводить ведущего по полям ->

 @Inject TimelinePresenterInjector mTimeLinePresenter;
 @Inject ProfilePresenterInjector mProfilePresenter;
 @Inject ProgramPresenterInjector mProgramPresenter;

и есть 3 функции для замены фрагмента ->

 private void replaceTimelineFragment() {

    TimeLineFragment fragment = TimeLineFragment.newInstance();
    getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();

    DaggerTimelinePresenterInjector.builder()
            .timeLinePresenterModule(new TimeLinePresenterModule(fragment))
            .build().inject(this);

}

функция замены фрагмента профиля ->

private void replaceProfileFragment() {

    ProfileFragment fragment = ProfileFragment.newInstance();
    getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();

    DaggerProfilePresenterInjector.builder()
            .timeLinePresenterModule(new ProfilePresenterModule(fragment))
            .build().inject(this);

}

но когда я перестраиваю проект, я получаю сообщение об ошибке

это неправильный шаблон? если да, то каков наилучший шаблон для внедрения другого ведущего в активность?


person Mehrdad Faraji    schedule 02.11.2016    source источник


Ответы (1)


Вы пытаетесь «связать» вызовы инфраструктуры внедрения зависимостей с бизнес-логикой приложения (т. е. выполнять внедрение, когда внутри вашего приложения происходят определенные события). Это действительно не очень хорошая идея.

Пойдя по этому пути, вы запутаете логику DI с бизнес-логикой вашего приложения, что значительно усложнит его отладку и поддержку.

«Лучшим шаблоном» (ИМХО, единственным шаблоном) было бы выполнить инъекцию только один раз в методе Activity onCreate(). Из вашего кода непонятно, почему вы хотите иметь ссылку на фрагменты внутри FooPresenterModule, но я настоятельно рекомендую вам найти для этого другое решение.

Одним из возможных решений было бы внедрить некоторый класс PresenterFactory в Activity и вызывать mPresenterFactory.getPresenterForFragment(fragment) при переключении на другой фрагмент.

Вы также можете прочитать этот пост: Внедрение зависимостей в Android.

person Vasiliy    schedule 10.12.2016