Intereting Posts
Android Connect Физическое устройство как устройство АБР, а не портативное устройство MEDIA_PROJECTION_SERVICE недействителен при вызове getSystemService () Не удалось подключиться к службе камеры на G1 Анимировать высоту PhotoView для Android GridView scrollBar: неустойчивое поведение при динамическом добавлении изображений Где константа запроса (64206) для входа в систему, определенная в Facebook SDK Android – VPN на собственном слое Android. Как установить все кнопки, которые можно щелкнуть или отключить в одно и то же время, используя setClickable? Получить элементы по имени тега из узла в документе Android (XML)? Используйте RxJava и Retrofit для перебора списка и увеличения результатов на основе подзапросов Ссылка «Просмотрите это приложение» в Phonegap / Cordova ActionBar setProgressBarIndeterminateVisibility (false) не работает на android 2.3 Навигационный ящик Animation android Обновить или изменить сообщение AlertDialog Близкая активность от другого действия посредством намерения

Как вставить презентатор в представление (шаблон MVP) с помощью Dagger2

Я хочу создать приложение для Android, используя шаблон MVP.

У меня есть фрагмент (вид) и класс презентатора.

Я хочу, чтобы в основном вставить презентатор в фрагмент, и установить фрагмент как представление ведущего (через интерфейс, который будет реализовывать представление)

Как я могу легко и правильно подключить 2, используя инъекцию зависимостей (с Dagger2)?

Редактировать:

Кроме того, я бы хотел, чтобы презентатор был синглом, так что он сможет сохранять данные и состояние через изменения ориентации

Сначала вам нужно определить модуль презентатора:

@Module class SearchPresenterModule { @NonNull private final SearchContract.View mView; SearchPresenterModule(@NonNull SearchContract.View view) { this.mView = view; } @Provides SearchContract.View provideSearchContractView() { return mView; } } 

Вот пример компонента:

 @FragmentScoped @Component(modules = SearchPresenterModule.class) interface SearchComponent { void inject(SearchActivity activity); } 

И введите своего докладчика:

 @Inject SearchPresenter mSearchPresenter; DaggerSearchComponent.builder() .searchPresenterModule(new SearchPresenterModule(searchFragment)) .build() .inject(this); 

Наконец, введи свой конструктор презентатора:

  @Inject SearchPresenter(@NonNull SearchContract.View view, @NonNull SearchRepository searchRepository) { this.mView = view; mView.setPresenter(this); } 

Дополнительно: здесь фрагментированная аннотация:

 @Documented @Scope @Retention(RetentionPolicy.RUNTIME) public @interface FragmentScoped { } 

Вы можете проверить мой пример репо для MVP + DAGGER2 https://github.com/savepopulation/wikilight

Поэтому ведущий подобен

 @Singleton public class Presenter{ private View mView; ... 

Представление должно быть

 public class View extends ...{ @Inject protected Presenter mPresenter ... 

Ну, вам просто нужен метод в вашем модуле, например

 inject(View view) 

И Кинжал должен заботиться о остальных, как одиночный экземпляр и инъекция