RxCommand
RxCommand copied to clipboard
RxCommendBinder里的enabledObservable没有响应
跟着Sample的学着写了一遍 发现RxCommend里的第一个参数Observable<Boolean>并没有响应 这里贴一下主要代码 希望作者可以帮忙debug一下 谢谢
ViewModel
public MutableLiveData<CharSequence> mPhone;
public MutableLiveData<CharSequence> mPassword;
public MutableLiveData<Boolean> mIsAgreement;
public Variable<CharSequence> mPhoneSubject;
public Variable<CharSequence> mPasswordSubject;
public Variable<Boolean> mIsAgreementSubject;
private Observable<Boolean> mPhoneValid;
private Observable<Boolean> mPasswordValid;
private Observable<Boolean> mIsAgreementValid;
private RxCommand<Login> mLoginCommend;
public SignInViewModel() {
mPhone = new MutableLiveData<>();
mPassword = new MutableLiveData<>();
mIsAgreement = new MutableLiveData<>();
mPhoneSubject = new Variable<>("");
mPasswordSubject = new Variable<>("");
mIsAgreementSubject = new Variable<>(false);
//这三个subject在input时都能正常响应
mPhoneValid = mPhoneSubject.asObservable().map(charSequence -> !TextUtils.isEmpty(charSequence));
mPasswordValid = mPasswordSubject.asObservable().map(charSequence -> !TextUtils.isEmpty(charSequence));
mIsAgreementValid = mIsAgreementSubject.asObservable().map(b -> b);
public RxCommand<Login> loginCommend() {
if(mLoginCommend == null) {
//而然到了这里却未能正确响应
Observable<Boolean> loginInputValid = Observable.combineLatest(
mPhoneValid,
mPasswordValid,
mIsAgreementValid,
(aBoolean, aBoolean2, aBoolean3) -> aBoolean && aBoolean2 && aBoolean3
);
mLoginCommend = RxCommand.create(loginInputValid, o -> {
return login(mPhone.getValue().toString(), mPassword.getValue().toString());
});
}
return mLoginCommend;
}
private Observable<Login> login(String phone, String password) {
HashMap<String, Object> params = FieldConfig.constructAPIParams();
params.put("loginName", phone);
params.put("passWord", password);
return ApiLoader.Request().login(params);
}
Fragment
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
mViewModel = ViewModelProviders.of(this).get(SignInViewModel.class);
mBinding.setViewModel(mViewModel);
subscribeToViewModel();
}
private void subscribeToViewModel() {
mViewModel.mPhone.observe(this, charSequence -> mViewModel.mPhoneSubject.setValue(charSequence));
mViewModel.mPassword.observe(this, charSequence -> mViewModel.mPhoneSubject.setValue(charSequence));
mViewModel.mIsAgreement.observe(this, b -> mViewModel.mIsAgreementSubject.setValue(b));
RxCommandBinder.bind(mBinding.buttonLogin, mViewModel.loginCommend(), Live.bindLifecycle(this));
}
不知道为什么改成原生的BehaviorSubject就可以了...神奇...
public MutableLiveData<CharSequence> mPhone;
public MutableLiveData<CharSequence> mPassword;
public MutableLiveData<Boolean> mIsAgreement;
public BehaviorSubject<CharSequence> mPhoneSubject;
public BehaviorSubject<CharSequence> mPasswordSubject;
public BehaviorSubject<Boolean> mIsAgreementSubject;
private Observable<Boolean> mPhoneValid;
private Observable<Boolean> mPasswordValid;
private Observable<Boolean> mIsAgreementValid;
private RxCommand<Login> mLoginCommend;
public SignInViewModel() {
mPhone = new MutableLiveData<>();
mPassword = new MutableLiveData<>();
mIsAgreement = new MutableLiveData<>();
mPhoneSubject = BehaviorSubject.createDefault("");
mPasswordSubject = BehaviorSubject.createDefault("");
mIsAgreementSubject = BehaviorSubject.createDefault(false);
mPhoneValid = mPhoneSubject.map(charSequence -> !TextUtils.isEmpty(charSequence));
mPasswordValid = mPasswordSubject.map(charSequence -> !TextUtils.isEmpty(charSequence));
mIsAgreementValid = mIsAgreementSubject.map(b -> b);
}
public RxCommand<Login> loginCommend() {
if(mLoginCommend == null) {
Observable<Boolean> loginInputValid = Observable.combineLatest(
mPhoneValid,
mPasswordValid,
mIsAgreementValid,
(aBoolean, aBoolean2, aBoolean3) -> aBoolean && aBoolean2 && aBoolean3
);
mLoginCommend = RxCommand.create(loginInputValid, o -> {
return login(mPhone.getValue().toString(), mPassword.getValue().toString());
});
}
return mLoginCommend;
}
private Observable<Login> login(String phone, String password) {
HashMap<String, Object> params = FieldConfig.constructAPIParams();
params.put("loginName", phone);
params.put("passWord", password);
return ApiLoader.Request().login(params);
}