Android MVP: определение Presenter во фрагментах

Я много искал в Google, а также в Stackoverflow, но все еще не понимаю, поэтому задаю вопрос здесь.

У меня есть этот небольшой шаблон проектирования MVP -

SigninView.java

public interface SigninView{

    void onSuccess();
    void onError();
    void onComplete();
}

SigninPresenter.java

public interface SigninPresenter {

    void signIn(String emailID, String password);
}

SigninModel.java

public class SigninModel implements SigninPresenter {

    private SigninView mSigninView;

    public SigninModel(SigninView mSigninView) {
        this.mSigninView = mSigninView;
    }

    @Override
    public void signIn(String emailID, String password) {

        if(emailID.equals("[email protected]") && password.equals("123")){
            mSigninView.onSuccess();
        }
        else{
            mSigninView.onError();
        }

        mSigninView.onComplete();

    }
}

Я хочу реализовать SigninView в фрагменте и определить там сам SigninPresenter следующим образом:

SigninPresenter mSigninPresenter = new SigninModel(view_of_mvp);
mSigninPresenter.signIn("adadada", "asads");

См. одну ссылку здесь. Я хочу реализовать View и определить Presenter, как это, но на фрагменте - https://github.com/ashokslsk/Comprehensive-MVP/blob/master/app/src/main/java/com/ashokslsk/mvpexample/MainActivity.java

Как этого добиться?


person Gissipi_453    schedule 09.04.2018    source источник


Ответы (2)


На самом деле вам не нужно передавать контекст, а скорее реализацию вашего SigninView. Итак, вам нужно реализовать свой фрагмент SigninView

MyFragment implements SigninView

и просто инициализируйте презентатора с помощью this вместо контекста. На самом деле докладчик не должен много знать об Android SDK, поэтому он не должен иметь дело с контекстами. См. этот ответ< /а>.

SigninPresenter mSigninPresenter = new SigninModel(this);

ИЗМЕНИТЬ:

У вас была такая активность:

public class MainActivity extends AppCompatActivity implements SigninView 

Все, что вам нужно сделать, это реализовать SigninView в вашем фрагменте:

public class MyFragment extends Fragment implements SigninView 

И затем в onCreateView вы можете инициализировать презентера следующим образом:

signinPresenter = new SigninPresenterImpl(this);
person Levi Moreira    schedule 09.04.2018
comment
Еще одна вещь. Разве разработчики не используют фрагменты в MVP, как это делаю я? Я задаю этот вопрос, потому что я много искал, но на самом деле не нашел ничего подобного. Я люблю, чтобы все было просто. - person Gissipi_453; 09.04.2018
comment
Так что довольно обычно иметь фрагменты как V в MVP, в конце концов, это зависит от ваших потребностей. - person Levi Moreira; 09.04.2018
comment
В ответе выше, как мы можем передать «это» как контекст во фрагменте? - person Gissipi_453; 09.04.2018
comment
Фрагменты не выходят за пределы контекста (например, действия и службы), поэтому вы не можете передать фрагмент в качестве контекста. Вы можете вызвать this.getContext(), чтобы получить контекст из фрагмента. - person Levi Moreira; 09.04.2018
comment
Смотрите, я обновил свой вопрос. При определении ведущего во фрагменте мне нужно передать представление MVP конструктору презентатора. Вот где у меня проблема. - person Gissipi_453; 09.04.2018
comment
Давайте продолжим обсуждение в чате. - person Gissipi_453; 09.04.2018
comment
благодаря. Принято как правильный ответ. Это решает мою проблему. - person Gissipi_453; 10.04.2018

Ваше представление уже реализует getContext(). Просто добавьте его в свой интерфейс и вызовите в своем SigninModel :

SigninPresenter.java

public interface SigninView {

    void onSuccess();
    void onError();
    void onComplete();

    Context getContext();
}

SigninModel.java

mSigninView.getContext();
person Thomas Mary    schedule 09.04.2018
comment
Это хак или стандартный способ? Я не указываю тебе, я просто хочу знать. Как я уже сказал, я запутался в этом деле. - person Gissipi_453; 09.04.2018
comment
Это не взлом, это то, для чего создан интерфейс. - person Thomas Mary; 09.04.2018