我正在尝试使用Dagger2创建子结构,并且eveything正常工作。如何使用Dagger2和MVP模式调用模型文件中的Presenter方法
我的主要问题是当我需要在模型文件中调用演示者方法时启动。让我给更多的细节。
正如你在我的模型文件中看到的,我向服务器请求改进并基于结果,我应该从演示者调用一个方法。由于模型将决定在演示者中应该使用哪种方法,并且根据选择的方法,演示者将调用视图方法。但问题是,演示者通过在构造函数中调用来使用模型,但即使演示者是中间人,模型也不能使用演示者。
- 下面的这个子结构适用于MVP。
- 谁有责任请求服务器演示者或模型?
- 如果我的子结构是正确的,Model应该如何用Dagger2调用演示文件文件?
这是我的MVP接口集群。
public interface IRegisterMVP {
interface View extends IGeneralViewOps{
void showWarning(String warningMessage);
void openMainActivity();
}
interface Presenter {
void setView(View view);
void registerTriggered(ArrayMap< String, String > userParameters);
void registerTriggered(EditText userName, EditText mailAddress, EditText password, EditText passwordRepeat);
void notValidated(String warningMessage);
void validate();
}
interface Model {
void validateData(ArrayMap< String, String > userParameters);
}
这是我的模块
@Module
public class UserOperationsModule {
@Provides
public IRegisterMVP.Presenter provideRegisterPresenter(IRegisterMVP.Model model){
return new RegisterFragmentPresenter(model);
}
@Provides
public IRegisterMVP.Model provideRegisterModel(Context context, IRegisterMVP.Presenter presenter){
return new UserBussinessModel(context);
}
}
这是我的演示
public class RegisterFragmentPresenter implements IRegisterMVP.Presenter {
private IRegisterMVP.View mView;
private IRegisterMVP.Model mModel;
public RegisterFragmentPresenter(IRegisterMVP.Model mModel) {
this.mModel = mModel;
}
@Override
public void setView(IRegisterMVP.View view) {
this.mView = view;
}
@Override
public void registerTriggered(ArrayMap< String, String > userParameters) {
this.mModel.validateData(userParameters);
}
@Override
public void registerTriggered(EditText userName, EditText mailAddress, EditText password, EditText passwordRepeat) {
ArrayMap< String, String > createViewValues = new ArrayMap<>(4);
createViewValues.put(UserBussinessModel.USER_NAME, userName.getText().toString());
createViewValues.put(UserBussinessModel.USER_MAIL_ADDRES, mailAddress.getText().toString());
createViewValues.put(UserBussinessModel.USER_PASS, password.getText().toString());
createViewValues.put(UserBussinessModel.USER_PASS_REPEAT, passwordRepeat.getText().toString());
this.registerTriggered(createViewValues);
}
@Override
public void notValidated(String warningMessage) {
this.mView.hideWaitingView();
this.mView.showWarning(warningMessage);
}
@Override
public void validate() {
this.mView.hideWaitingView();
this.mView.openMainActivity();
}
}
而且这是我的商业模式文件
public UserBussinessModel(Context context) {
this.mContext = context;
}
public UserBussinessModel(Context mContext, IRegisterMVP.Presenter mRegisterPresenter) {
this.mContext = mContext;
this.mRegisterPresenter = mRegisterPresenter;
}
public UserBussinessModel(Context mContext, LoginMVP.Presenter mLoginPresenter) {
this.mContext = mContext;
this.mLoginPresenter = mLoginPresenter;
}
@Override
public void validateData(ArrayMap< String, String > userParameters) {
Call< MainModel<Fortune> > jsonObjectCall = this.mFortuneService.getSpesificFortuneBasedOnUser(userUUID, fortune_id);
jsonObjectCall.enqueue(new Callback< MainModel<Fortune> >() {
@Override
public void onResponse(Call< MainModel<Fortune> > call, Response< MainModel<Fortune> > response) {
// HOW SHOULD MODEL INVOKE THE PRESENTER METHOD IN ORDER TO ARRANGE VIEW FILES?
}
@Override
public void onFailure(Call< MainModel<Fortune> > call, Throwable t) {
// HOW SHOULD MODEL INVOKE THE PRESENTER METHOD IN ORDER TO ARRANGE VIEW FILES?
}
});
}
Waow。多好的解释 –
在我研究Google Android体系结构蓝图之前,我使用了Model文件,以便确定应用程序的行为方式,但据我了解,该模型应该用于本地存储操作。但我无法理解谁负责与服务器通信。演示者或模型? @大卫 –