1

所以,我目前正在尝试在我不熟悉的 android 中实现 MVP 方法。现在,它声明presenter 和interactor 类都不应该有关于android 类或组件的知识。

将业务逻辑与框架分离是有意义的。目前很好。

但是,我有一个演示者,它实现了一个回调以登录交互器,它传递了一个字符串资源 ID。演示者将字符串 res id 传递给以某种形式(无论是 toast 还是对话框)显示错误消息的视图。

交互者:

public interface SignInteractor {

void login(String email, String password, OnLoginListener loginListener);

interface OnLoginListener {

    void onLoginSuccess();

    void onLoginFail(int error);

   } 
}

主持人:

public interface SignInPresenterImpl {
private SignInteractorImpl mInteractor; // interactor implementation
private SignInView mSignInView; // view reference

// additional code 

    void login(String email, String password){

        mInteractor.login(email,password, new SignInteractor.OnLoginListener(){

        @Override
        public void onLoginSuccess() {
            if (mSignInView != null) {
                mSignInView.signInSuccess();
            }
        }

        @Override
        public void onLoginFail(final int error) {
            if (mSignInView != null) {
                mSignInView.showError(R.string.error);
            }
        }
        })
    }

}

活动视图:

SignInViewActivity implements SignInView{
   // additional code

   void showError(int resId){
    Toast.makeText(this, getString(resId), Toast.LENGTH_SHORT).show();
   }
}

然而,由于 R 文件是 android 框架的一部分,这使得演示者和交互器无法在纯 Java 应用程序中使用。

我在各种论坛上浏览了很多文章和讨论,这些论坛提供了实现这一目标的各种方法。

解决方案:

  1. 视图应该使用类似 showLoginError() 的方法,并自行决定如何处理视图逻辑。通过这种方式,演示者不了解与 android 相关的内容。

    • 但是,来自交互器的字符串操作是不可能的。
  2. 在视图中创建处理所有情况的特定方法,例如 showinvalidEmail()、showinvalidPassword() 等。

    • 方法太多,在复杂的情况下很难。
  3. 使用枚举作为错误类型并传递给视图 view.showError(ErrorTypes.INVALID_EMAIL) -仍然对#enumsmatter 感到困惑:)

https://www.reddit.com/r/androiddev/comments/4v4urs/mvp_question_how_do_you_populate_your_textviews/

  1. 使用提供所需字符串的资源抽象或包装类。
    • 当有大量的字符串要使用时很困难。

https://medium.com/@daptronic/android-mvp-the-curious-case-of-resources-ddca39c1fccd

  1. 使用为 strings.xml 中的每个字符串提供 api 实现的库
    • 仍处于测试阶段

https://github.com/Comcast/resourceprovider

请建议什么是实现这一目标的最佳方法,以免违反 mvp 或干净架构的原则。

4

3 回答 3

0

由于您现在已经在登录失败时希望显示哪个错误,因此您只需要从声明中删除参数并尝试在没有任何参数的情况下从演示者调用该方法,并且当此函数调用如下showError时,视图将负责显示哪个消息:showError

看法

void showError(){
    Toast.makeText(this, getString(R.string.error), Toast.LENGTH_SHORT).show();
}

主持人

mSignInView.showError();

并且还定义了另一种方法来显示响应中的错误,如下所示:

看法

void showError(String error){
    Toast.makeText(this, error, Toast.LENGTH_SHORT).show();
}

主持人

mSignInView.showError(error);
于 2017-10-26T05:33:38.073 回答
0

在我的理解中,MVP 并不是要从你的业务逻辑中移除 android 类,而是要分离逻辑和 UI 部分,从交互器中访问 android 类或资源并不是一个错误。

但是如果你想完全分离,即所有的android资源或类从interactor然后提供类型并从UI中读取它。

SignInViewActivity implements SignInView{
// additional code

    void showError(int errorType){
         switch(errorType){
             case ....:
         }
         //display message
    }
}
于 2017-10-26T06:04:02.080 回答
0

您可以创建一个枚举类,例如

 enum class AuthError {
        INPUT_EMAIL_INVALID,
        INPUT_PASSWORD_INVALID,
        RESPONSE_EMAIL_DOES_NOT_EXIST
 }

然后你可以通过它来查看这样的

AuthView.someError(AuthError.INPUT_EMAIL_INVALID)

您可以通过检查 AuthError 的类型来检查错误的类型,您可以从那里调用R.string.error_message

这将删除带有 Android 特定代码的 Presenter。

于 2019-05-27T09:28:34.360 回答