1

鉴于以下情况:

AView具有 aCheckBox和多个EditTexts提供使用Jake Wharton 的 RxBinding
的访问权限,如下所示ViewObservables

fun observeUsername(): InitialValueObservable<CharSequence> = RxTextView.textChanges(et_username)

对于EditTexts(其中三个,用于用户名、密码和电子邮件)和

fun observeSignUpCheckBox(): InitialValueObservable<Boolean> = RxCompoundButton.checkedChanges(cb_sign_up)

为了CheckBox

Presenter特点是一种方法,EditText它很简单

fun observeUsernameText(): Disposable {
    return view.observeUsernameText()
            .skipInitialValue()
            .map { username -> StringUtils.isValidUsername(username.toString()) }
            .subscribe({ view.setValidUsername(it) })
}

和一种方法CheckBox

fun observeSignUpCheckBox(): Disposable {
    return view.observeSignUpCheckBox()
            .subscribe({ checked ->
                Timber.d("### view trigger")
            })
}

所有这些方法都被调用,onCreate一切Presenter都按预期工作。

现在的问题:我在验证用户输入
的新函数中添加了一个:Presenter

fun observeInputFields(): Disposable {
    val email = view.observeEmailText().map { email -> StringUtils.isValidEmail(email.toString()) }
    val password = view.observePasswordText().map { password -> StringUtils.isValidPassword(password.toString()) }
    val signUp = view.observeSignUpCheckBox()
    val username = view.observeUsernameText().map { username -> StringUtils.isValidUsername(username.toString()) }
    return Observable.combineLatest(email, password, signUp, username,
            Function4<Boolean, Boolean, Boolean, Boolean, Boolean> { validEmail, validPassword, signUpChecked, validUsername ->
                validEmail && validPassword && (!signUpChecked || signUpChecked && validUsername)
            })
            .subscribe({ validForm ->
                Timber.d("### form trigger")
                view.enableContinue(validForm)
            })
}

每当我更改EditText两者的内容Subscriptions(用于 的内容EditText和添加的组合内容observeInputFields)时,都会按预期接收事件。
但是,如果我点击CheckBox 最后一个Subscription接收事件,具体取决于onCreate.

fun onCreate() {
    // here the logs only show '### form trigger'
    disposables.add(observeSignUpCheckBox())
    disposables.add(observeInputFields())
    // ... omitted for clarity
}

或者

fun onCreate() {
    // here the logs only show '### view trigger'
    disposables.add(observeInputFields())
    disposables.add(observeSignUpCheckBox())
    // ... omitted for clarity
}

我不明白为什么这种奇怪的事情只发生CheckBox在 s 而不是EditTexts。这非常令人困惑......

非常感谢任何帮助,因为我目前陷入困境:(

谢谢!

4

1 回答 1

1

如果您在此处此处查看库的源代码,您将看到您所描述的是预期行为。对于 a CompoundButton,您一次只能拥有一个Observable,但对于TextView多个。

如果你想走得更远,你可以看到在这里创建Observable你需要使用setOnCheckedChangeListeneron ,CompoundButton它每次都会替换可能的现有监听器。

另一方面,TextView您可以添加多个TextWatchers并单独删除每个onDispose

于 2017-10-03T00:38:52.830 回答