【发布时间】:2019-09-17 02:17:55
【问题描述】:
我正在使用 MVVM 设计模式制作用户登录屏幕,但在实现电话号码验证的逻辑时我被卡住了。 我读出了 Rules to follow when working with mvvm (第 4 条规则) View 不应该有任何逻辑,甚至不是简单的 if 条件。视图的所有逻辑都发生在 ViewModel 中。
这是我的 ViewModel 类。
public class LoginViewModel extends AndroidViewModel {
private LoginRepository loginRepository;
private HashMap<String,String> mNumberParam;
private MutableLiveData<Boolean> isValidated;
public LoginViewModel(@NonNull Application application) {
super(application);
loginRepository=LoginRepository.getInstance();
isValidated=new MutableLiveData<>();
}
public LiveData<List<OtpEnterModel.Data>> enterNumberApiHit(){
return loginRepository.enterNumberApiHit(mNumberParam);
}
public void onSubmitClick(String number){
//if mobile number not enter or wrong enter show message ,and tell the view to hide other view
if (number==null) {
Toast.makeText(getApplication(), "Invalid mobile number", Toast.LENGTH_SHORT).show();
isValidated.setValue(false);
} else {
//otherwise save mobile number in hashMap ,and tell the view to work further
isValidated.setValue(true);
saveNumberParam(number);
}
}
//to save the mobile number in hashMap with key i.e mobile_number.
private void saveNumberParam(String mobileNumber) {
//if hashMap null then initialize it
if (mNumberParam ==null) {
mNumberParam = new HashMap<>();
}
mNumberParam.put(MyConstant.MOBILE_NUMBER, mobileNumber);
}
public LiveData<Boolean> isValidated(){
return isValidated;
}
}
这是我的 View 类。
public class EnterNumber extends AppCompatActivity implements View.OnClickListener, FragmentManager.OnBackStackChangedListener {
//dataType
private Context context;
private FragmentManager manager;
private LoginViewModel loginViewModel;
//views
private EditText enterMobileEDT;
private ProgressBar progressBar;
private Button btnNumber;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_enter_number);
manager=getSupportFragmentManager();
context = EnterNumber.this;
loginViewModel= ViewModelProviders.of(this).get(LoginViewModel.class);
init();
setListener();
}
//all views initialize here
private void init() {
enterMobileEDT = findViewById(R.id.enterMobileET);
progressBar=findViewById(R.id.progressBar);
btnNumber=findViewById(R.id.btn_number);
}
//listener for views
private void setListener() {
btnNumber.setOnClickListener(this);
manager.addOnBackStackChangedListener(this);
}
//check for mobile number and send otp by hitting API
@Override
public void onClick(View v) {
if (v.getId() == R.id.btn_number) {
loginViewModel.onSubmitClick(enterMobileEDT.getText().toString());
numberValidation();
}
}
//check for editText length
public void numberValidation() {
loginViewModel.isValidated().observe(this, new Observer<Boolean>() {
@Override
public void onChanged(Boolean aBoolean) {
if(aBoolean){
loginApiHit();
}
hideShowView(aBoolean);
}
});
}
//hide and show the view based on condition
public void hideShowView(boolean wantToShowProgress) {
if(!wantToShowProgress){
progressBar.setVisibility(View.INVISIBLE);
btnNumber.setEnabled(true);
}else {
progressBar.setVisibility(View.VISIBLE);
btnNumber.setEnabled(false);
}
}
}
如何将所有 if/else 条件从 View 移动到 ViewModel?
【问题讨论】:
-
在 Java 或 Kotlin 或其他东西中无关紧要。你的业务逻辑是什么?能否简单总结一下你的业务逻辑?
-
简单来说可以是电子邮件和密码验证。
-
业务逻辑应该包含在数据层(如模型类)中。
-
@EthanChoi 那么我应该在模型中传递邮件和密码编辑文本字符串以进行验证吗?
标签: java android design-patterns android-jetpack android-mvvm