RxCommand icon indicating copy to clipboard operation
RxCommand copied to clipboard

RxCommendBinder里的enabledObservable没有响应

Open jeonhei opened this issue 5 years ago • 1 comments

跟着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));
    }

jeonhei avatar Nov 21 '18 03:11 jeonhei

不知道为什么改成原生的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);
    }

jeonhei avatar Nov 21 '18 04:11 jeonhei