Учитывая следующий сценарий:
View
с CheckBox
и несколькими EditText
View
предлагает доступ к Observables
с помощью RxBinding Джейка Уортона вот так
fun observeUsername(): InitialValueObservable<CharSequence> = RxTextView.textChanges(et_username)
для EditText
s (их три, для имени пользователя, пароля и электронной почты) и
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
}
or
fun onCreate() {
// here the logs only show '### view trigger'
disposables.add(observeInputFields())
disposables.add(observeSignUpCheckBox())
// ... omitted for clarity
}
Я не могу понять, почему эта странная вещь происходит только для CheckBox
, но не для EditText
. Это сильно сбивает с толку...
Любая помощь очень ценится, так как я в настоящее время застрял на этом :(
Спасибо!