【问题标题】:Passing string resource from interactor to view in android MVP从交互器传递字符串资源以在 android MVP 中查看
【发布时间】:2018-04-07 08:24:12
【问题描述】:

所以,我目前正在尝试在我不熟悉的 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. view 应该使用类似 showLoginError() 的方法并自己决定如何处理视图逻辑。这样,presenter 就不知道 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 或干净架构原则的情况下实现此目标的最佳方法。

【问题讨论】:

    标签: java android android-resources android-mvp


    【解决方案1】:

    你可以创建一个枚举类,比如

     enum class AuthError {
            INPUT_EMAIL_INVALID,
            INPUT_PASSWORD_INVALID,
            RESPONSE_EMAIL_DOES_NOT_EXIST
     }
    

    那么就可以这样传给view了

    AuthView.someError(AuthError.INPUT_EMAIL_INVALID)
    

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

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

    【讨论】:

      【解决方案2】:

      在我的理解中,MVP 并不是要把 android 类从你的业务逻辑中拿走,而是把逻辑和 UI 部分分开,从交互器中访问一个 android 类或资源并没有错。

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

      SignInViewActivity implements SignInView{
      // additional code
      
          void showError(int errorType){
               switch(errorType){
                   case ....:
               }
               //display message
          }
      }
      

      【讨论】:

        【解决方案3】:

        由于您现在已经在登录失败时希望显示哪个错误,因此您只需要从 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);
        

        【讨论】:

        • @PramodGarg 然后您需要为此定义一些常量,并根据该常量视图确定需要显示的消息。
        • 所以基本上我需要某种枚举(解决方案 3)来确定错误的类型?
        猜你喜欢
        • 2017-03-16
        • 2023-03-27
        • 2018-01-17
        • 1970-01-01
        • 2016-06-15
        • 1970-01-01
        • 1970-01-01
        • 2022-01-10
        • 2021-05-29
        相关资源
        最近更新 更多