RxJava2 Flowable.combine Последнее поведение, если все Flowables не излучают
Я следую этому коду, чтобы сделать некоторые проверки ошибок. Ниже приведена реализация CombineLatest, которая принимает входные данные из 3 полей и выполняет проверку ошибок для каждого из них.
Flowable.combineLatest(
_emailChangeObservable,
_passwordChangeObservable,
_numberChangeObservable,
(newEmail, newPassword, newNumber) -> {
boolean emailValid = !isEmpty(newEmail) && EMAIL_ADDRESS.matcher(newEmail).matches();
if (!emailValid) {
_email.setError("Invalid Email!");
}
boolean passValid = !isEmpty(newPassword) && newPassword.length() > 8;
if (!passValid) {
_password.setError("Invalid Password!");
}
boolean numValid = !isEmpty(newNumber);
if (numValid) {
int num = Integer.parseInt(newNumber.toString());
numValid = num > 0 && num <= 100;
}
if (!numValid) {
_number.setError("Invalid Number!");
}
return emailValid && passValid && numValid;
})
.subscribe(_disposableObserver);
Моя проблема заключается в том, что функция объединителя не запускается, если все 3 наблюдаемые поля ввода не выпустили хотя бы один раз. Поэтому, когда пользователи вводят неправильный адрес электронной почты, они не уведомляются, пока не введут некоторые данные во все 3 поля.
1 ответ
combineLatest()
должен иметь все значения для начала излучения чего-либо, так как по определению функция объединения получает n значений, которые испускаются из n источников.
Когда RxBInding оборачивается TextView
события с RxTextView
, он испускает начальное значение (содержимое TextView
) при подписке, так без skip(1)
, у вас будет желаемая логика, дело в том, что логика проверки в этом примере не ожидает этого, и отображает ошибку для пустых значений (!isEmpty(newXXX)
чеки).
Моя догадка основана на явном skip(1)
трансформация заключается в том, что в этом примере это желаемое поведение - то есть, когда все поля введены, нам нужно отобразить ошибки.
В вашем случае, если вы хотите реализовать свою логику, вам нужно пропустить пустые значения от отображения ошибок, пока вы все еще излучаете false
в конце, так как весь ввод еще не действителен, тогда - с любым изменением в любых полях, независимых от других, в то время как не пустые вы увидите ошибки.