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

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

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

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

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

Изменить:

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


person dors    schedule 11.08.2015    source источник
comment
Рассматривали ли вы Mortar github.com/square/mortar? или ядро ​​github.com/konmik/nucleus?   -  person Emma    schedule 12.08.2015
comment
Спасибо @Emma, ​​эти библиотеки выглядят интересно. Тем не менее, я пытаюсь узнать об использовании dagger2 и DI, поэтому мне все еще хотелось бы знать, как лучше всего реализовать MVP с помощью Dagger2.   -  person dors    schedule 12.08.2015
comment
Я понимаю. Mortar использует кинжал в качестве инъекции представления, однако у Mortar есть свои собственные классы представления и presenter, поэтому вы не будете использовать фрагмент.   -  person Emma    schedule 12.08.2015
comment
Спасибо :) Я все же хотел бы узнать ответ на свой вопрос с помощью dagger2, хотя   -  person dors    schedule 14.08.2015
comment
Если вы хотите привязать презентатора к области действия или фрагмента, тогда вам понадобятся либо области, предоставленные Mortar, либо вам понадобится сохраненный фрагмент, либо вам понадобятся одноэлементные презентаторы, которые являются болью быть правым. Dagger2 и прицелы с сохранением ориентации не исключают друг друга, на самом деле они вполне ортогональны. Строительный раствор позволяет с минимальными усилиями удерживать компонент с оптическим прицелом.   -  person EpicPandaForce    schedule 26.08.2015


Ответы (2)


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

@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

person savepopulation    schedule 31.10.2016

так что ведущий похож

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

вид должен быть

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

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

inject(View view)

а Dagger должен позаботиться обо всем остальном, например об экземпляре singleton и инъекции

person gropapa    schedule 17.10.2015