gpt4 book ai didi

java - 使用 mvvm 时将业务逻辑放在哪里

转载 作者:行者123 更新时间:2023-12-02 09:31:06 25 4
gpt4 key购买 nike

我正在使用MVVM设计模式制作用户登录屏幕,但当它实现电话号码验证的逻辑时,我陷入了困境。我读出了Rules to follow when working with mvvm (规则 4) View 中不应该有任何逻辑,甚至不应该是一个简单的 if 条件。 View 的所有逻辑都发生在 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?

最佳答案

问题

How Can I move all if/else condition from View to ViewModel?

  • 建议您删除 View 中的所有业务逻辑
  • View 仅具有用于更新耦合 ViewModel 数据 (LiveData) 的 UI 的代码,可以通过 ViewDataBininding 库减少这些代码。
  • 最后,View 只有与设置 ViewDataBindingViewModel 相关的代码。

View 模型

public class LoginViewModel extends AndroidViewModel {
...
private MutableLiveData<String> _email = new MutableLiveData<>(); // is binded some UI such as EditText..

LiveData<Boolean> emailValidate = Transformations.map(_email, this::emailValidate);

private boolean emailValidate(String email) {
return true; // implements email validation logic
}
...
}

查看

...
@Override
public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
LoginViewModel loginViewModel= ViewModelProviders.of(this).get(LoginViewModel.class);
subscribe(loginViewModel);
}

private void subscribe(LoginViewModel loginViewModel) {
loginViewModel.emailValidate.observe(this, this::setEmailValidateLayout);
// You shouldn't implement observing in the onClick event. Overlapping observers problem.
}

private void setEmailValidateLayout(boolean validate) {
progressBar.setVisibility(validate ? View.VISIBLE : View.INVISIBLE);
btnNumber.setEnabled(validate);
}
...

关于java - 使用 mvvm 时将业务逻辑放在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57966523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com