2017-07-05 1 views
0

Je suis this code pour effectuer une validation d'erreur. Voici l'implémentation de combineLatest qui accepte les entrées de 3 champs et valide les erreurs sur chacun d'entre eux.RxJava2 Flowable.combineDernier comportement si tous les Flowables n'émettent pas

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); 

Mon problème est que la fonction de combinaison ne se déclenche pas à moins que tous les trois champs d'entrée ont émis au observables moins une fois. Ainsi, lorsque les utilisateurs entrent une adresse e-mail incorrecte, ils ne sont pas avertis avant d'avoir entré des données dans les trois champs.

+0

vous avez essayé juste d'exécuter du code RxJava-Android-échantillons? ou écrire un nouveau code basé sur cela? – yosriz

+0

J'utilise le même code pour apprendre. Pas de modifications Si vous voyez le code lié, si je retire la benne (1) appelle de la coulants, je peux recevoir des notifications d'erreur que je veux - mais il y a des notifications d'erreur dès que je lance le fragment (sans intervention de l'utilisateur). – SlowAndSteady

Répondre

1

combineLatest() doit avoir toutes les valeurs pour commencer quelque chose émettant, comme par définition la fonction combinateur obtient n valeurs qui émettaient des sources de n.

Lorsque RxBInding enveloppe TextView événements avec RxTextView, il émet une valeur initiale (contenu du TextView) lorsqu'il a souscrit, sans le skip(1), vous aurez votre logique désirée, la chose est la logique de validation dans cet échantillon ne vous attendez pas cela, et l'erreur d'affichage pour les valeurs vides (par les contrôles !isEmpty(newXXX)).
Mon intuition basée sur la transformation skip(1) explicite est que, dans cet exemple, il est le comportement souhaité - ce qui signifie que lorsque tous les champs ont été saisis, nous devons afficher les erreurs. Dans votre cas, si vous souhaitez implémenter votre logique, vous devez ignorer les valeurs vides pour afficher les erreurs tout en émettant false à la fin car l'entrée entière n'est pas encore valide, puis - avec n'importe quel changement dans des champs indépendants de les autres, bien que non vides, vous ferez les erreurs.