所以,我目前正在尝试在我不熟悉的 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 应用程序中使用。
我在各种论坛上浏览了很多文章和讨论,这些论坛提供了实现这一目标的各种方法。
解决方案:
视图应该使用类似 showLoginError() 的方法,并自行决定如何处理视图逻辑。通过这种方式,演示者不了解与 android 相关的内容。
- 但是,来自交互器的字符串操作是不可能的。
在视图中创建处理所有情况的特定方法,例如 showinvalidEmail()、showinvalidPassword() 等。
- 方法太多,在复杂的情况下很难。
使用枚举作为错误类型并传递给视图 view.showError(ErrorTypes.INVALID_EMAIL) -仍然对#enumsmatter 感到困惑:)
https://www.reddit.com/r/androiddev/comments/4v4urs/mvp_question_how_do_you_populate_your_textviews/
- 使用提供所需字符串的资源抽象或包装类。
- 当有大量的字符串要使用时很困难。
https://medium.com/@daptronic/android-mvp-the-curious-case-of-resources-ddca39c1fccd
- 使用为 strings.xml 中的每个字符串提供 api 实现的库
- 仍处于测试阶段
https://github.com/Comcast/resourceprovider
请建议什么是实现这一目标的最佳方法,以免违反 mvp 或干净架构的原则。