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 в конце, так как весь ввод еще не действителен, тогда - с любым изменением в любых полях, независимых от других, в то время как не пустые вы увидите ошибки.

Другие вопросы по тегам