2017-11-10 54 views
8

मेरे पास 4 संभावित विकल्पों के साथ एक फॉर्म है जिसे जांचने की आवश्यकता है (परिस्थितियों के आधार पर भी कम हो सकता है)। आदेश बनाने के दौरान 2 editexts, ईमेल के लिए एक और एक संदर्भ फ़ील्ड के लिए एक हैं।RxJava2 फॉर्म सत्यापन

ईमेल और संदर्भ फ़ील्ड शर्तों के आधार पर खाली हो सकते हैं या नहीं छोड़े जा सकते हैं (जो फॉर्म बनने पर उपलब्ध हैं)। इसके अतिरिक्त हमें उपयोगकर्ता को यह बताने के लिए एक चेतावनी संवाद दिखाना पड़ सकता है कि संदर्भ मान (ऑर्डर प्राप्तकर्ता को) दिखाना संभव नहीं हो सकता है और उन्हें किसी नियम और शर्त अलर्ट संवाद से सहमत होने की भी आवश्यकता हो सकती है।

वर्तमान में onConfirm चेक, कुछ इस तरह है

void onCreateOrderConfirmed(@Nullable final String receiverEmail, 
          @Nullable final String reference, 
          @Nullable final Boolean noRefAgreed, 
          @Nullable final Boolean termsAndConditionsAgreed) { 

    if (!reviewCompletionState.emailRequirementSatisfied()) { 
     if (!isValidEmail(receiverEmail)) { 
      view.showEmailError(); 
      return; 
     } 

     reviewCompletionState = reviewCompletionState.newBuilder() 
       .receiverEmail(receiverEmail) 
       .emailRequirementSatisfied(true) 
       .build(); 
    } 

    if (!reviewCompletionState.referenceRequirementSatisfied()) { 
     if (isEmpty(reference)) { 
      view.showReferenceError(); 
      return; 
     } 

     reviewCompletionState = reviewCompletionState.newBuilder() 
       .reference(reference) 
       .referenceRequirementSatisfied(true) 
       .build(); 
    } 

    if (!reviewCompletionState.noRefAgreed()) { 
     if (noRefAgreed == null || !noRefAgreed) { 
      view.showNoReferenceAlert(); 
      return; 
     } 

     reviewCompletionState = reviewCompletionState.newBuilder() 
       .noRefAgreed(true) 
       .build(); 
    } 

    if (!reviewCompletionState.termsAndConditionsAgreed()) { 
     if (termsAndConditionsAgreed == null || !termsAndConditionsAgreed) { 
      view.showTermsDisclaimerAlert(); 
      return; 
     } 

     reviewCompletionState = reviewCompletionState.newBuilder() 
       .termsAndConditionsAgreed(true) 
       .build(); 
    } 

    createOrder(); 
} 

मैं इस मान्यता RxJava2 साथ सरल बनाने के लिए एक तरह से वहाँ है अगर पता करने के लिए प्यार होता है?

TIA

उत्तर

3

मुझे लगता है कि (लेकिन वर्तमान में यह करने के लिए सक्षम होने के लिए पर्याप्त जानकारी नहीं है) आपको चाहिए RxJava CombineLatest, आप प्रपत्र इनपुट के सभी बस एक नमूदार उत्पादन कर रहे हैं, तो आप की जरूरत है ताकि एक संदर्भ के रूप में यह गठबंधन और देखने

समायोजित आप देख सकते हैं:

https://medium.com/@etiennelawlor/rxjava-on-the-sign-in-screen-9ecb66b88572

Using RxJava for email login validation, an observable is emitting twice

========

उदाहरण:

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.Button; 
import android.widget.CheckBox; 
import android.widget.EditText; 
import android.widget.Toast; 

import com.jakewharton.rxbinding2.view.RxView; 
import com.jakewharton.rxbinding2.widget.RxCompoundButton; 
import com.jakewharton.rxbinding2.widget.RxTextView; 

import io.reactivex.Observable; 


public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    EditText receiverText = findViewById(R.id.input_receiver); 
    EditText referenceText = findViewById(R.id.input_reference); 
    CheckBox checkRef = findViewById(R.id.check_ref); 
    CheckBox checkTerms = findViewById(R.id.check_terms); 
    Button buttonLogin = findViewById(R.id.button_login); 

    Observable<CharSequence> receiverObservable = RxTextView.textChanges(receiverText).skip(1); // can add more logic 
    Observable<CharSequence> referenceObservable = RxTextView.textChanges(referenceText).skip(1); // can add more logic 
    Observable<Boolean> refCheckObservable = RxCompoundButton.checkedChanges(checkRef); // can add more logic 
    Observable<Boolean> termsCheckObservable = RxCompoundButton.checkedChanges(checkTerms); // can add more logic 

    Observable<String> combineObservable = Observable.combineLatest(
      receiverObservable, 
      referenceObservable, 
      refCheckObservable, 
      termsCheckObservable, (receiverCharSequence, referenceCharSequence, refBoolean, termsBoolean) -> { 
       // add logic here for now it is only combine the input 
       return receiverCharSequence + " " + referenceCharSequence + " " + refBoolean + " " + termsBoolean ;} 
      ); 

    RxView.clicks(buttonLogin).flatMap(o -> { return combineObservable;}).distinctUntilChanged().subscribe(string -> { 
     Toast.makeText(this, string, Toast.LENGTH_LONG).show(); 
    }); 

    } 
} 
+0

धन्यवाद: सत्यापनकर्ता के लिए

public abstract class Validator<Model> { public Single<Model> validate(Model model) { return Single.just(model) .map(this::validateModel) .flatMap(this::processResult); } private Single<Model> processResult(ValidateResultModel<Model> validateResultModel) { return Single.create(subscriber -> { List<ValidateError> validateErrors = validateResultModel.getValidateErrors(); if (validateErrors.isEmpty()) { subscriber.onSuccess(validateResultModel.getModel()); } else { subscriber.onError(new ValidateException(validateErrors)); } }); } private ValidateResultModel<Model> validateModel(Model model) { List<ValidateError> errors = new LinkedList<>(); for (ValidateFunction validateFunctions : getValidateFunctions(model)) { ValidateError error = validateFunctions.validate(); if (error != null) { errors.add(error); } } return new ValidateResultModel<>(model, errors); } protected abstract List<ValidateFunction> getValidateFunctions(Model model); protected interface ValidateFunction { @Nullable ValidateError validate(); } } 

हेल्पर कक्षाएं ...

public class ValidateError { private Field field; public ValidateError(Field field) { this.field = field; } public Field getField() { return field; } } class ValidateResultModel<T> { private T model; private List<ValidateError> validateErrors; ValidateResultModel(T model, List<ValidateError> validateErrors) { this.model = model; this.validateErrors = validateErrors; } T getModel() { return model; } List<ValidateError> getValidateErrors() { return validateErrors; } } public class ValidateException extends RuntimeException { private List<ValidateError> validateErrors; ValidateException(List<ValidateError> validateErrors) { this.validateErrors = validateErrors; } public List<ValidateError> getValidateErrors() { return validateErrors; } } 

प्रारंभ में, मैं यहाँ से विचार ले लिया! मैं जरूरी नहीं कि टेक्स्ट बदलते हुए स्वचालित सामान आदि चाहते हैं। उपयोगकर्ता पुष्टि बटन पर क्लिक करते समय मान्य करना चाहता है (क्योंकि मैं यह देखना नहीं चाहता कि मुझे यह देखने के लिए जांचना है कि मुझे उस तक अलर्ट संवाद कब पॉप अप करना चाहिए) –

+0

फिर पुष्टिकरण बटन –

+0

के अंदर नवीनतम गठबंधन डालें, क्या आप इस तरह के एक छोटे स्निपेट को साझा कर सकते हैं (जहां कम से कम एक संवाद प्रदर्शित करने की आवश्यकता है)? –

4

यह एक सरल हो सकता है। बहुत सारे कोड होंगे, मैं पहले परिणाम दिखाऊंगा।

private ReviewValidator reviewValidator = new ReviewValidator(); 

    void onCreateOrderConfirmed(@Nullable final String receiverEmail, 
           @Nullable final String reference, 
           @Nullable final Boolean noRefAgreed, 
           @Nullable final Boolean termsAndConditionsAgreed) { 
     ReviewState reviewState = new ReviewState(receiverEmail, 
       reference, 
       noRefAgreed, 
       termsAndConditionsAgreed);//another model for simplicity 

     reviewValidator.validate(reviewState) 
       .flatMap(reviewState -> /* create order */) 
       .subscribe(this::onOrderCreated, this::onOrderCreatingError); 

    } 

    void onOrderCreated(Object order) {//or what you need here 
     //handle positive result 
    } 

    void onOrderCreatingError(Throwable throwable) { 
     if (throwable instanceof ValidateException) { 
      List<ValidateError> errors = ((ValidateException) throwable).getValidateErrors(); 
      for (ValidateError error: errors) { 
       switch (error.getField()) { 
        case EMAIL: { 
         view.showEmailError(); 
         return;//or break if you want show all errors 
        } 
        case REFERENCE: { 
         view.showReferenceError(); 
         return; 
        } 
        //handle another errors.... 
       } 
      } 
     //handle another error cases... 
    } 

पहले, reviewState के लिए मॉडल बनाने:

public class ReviewState { 

    private String receiverEmail; 
    private String reference; 
    private Boolean noRefAgreed; 
    private Boolean termsAndConditionsAgree; 

    public ReviewState(String receiverEmail, 
         String reference, 
         Boolean noRefAgreed, 
         Boolean termsAndConditionsAgree) { 
     this.receiverEmail = receiverEmail; 
     this.reference = reference; 
     this.noRefAgreed = noRefAgreed; 
     this.termsAndConditionsAgree = termsAndConditionsAgree; 
    } 

    public String getReceiverEmail() { 
     return receiverEmail; 
    } 

    public String getReference() { 
     return reference; 
    } 

    public Boolean getNoRefAgreed() { 
     return noRefAgreed; 
    } 

    public Boolean getTermsAndConditionsAgree() { 
     return termsAndConditionsAgree; 
    } 
} 

तो फिर तुम ही सत्यापनकर्ता पैदा करते हैं। एक संपूर्ण मॉडल बनाना जरूरी नहीं है, आप प्रत्येक फ़ील्ड के लिए सत्यापनकर्ता बना सकते हैं और उन्हें अपनी पसंद के फ्लैटमैप() से जोड़ सकते हैं।

public class ReviewValidator extends Validator<ReviewState> { 

    @Override 
    protected List<ValidateFunction> getValidateFunctions(ReviewState reviewState) { 
     List<ValidateFunction> validateFunctions = new LinkedList<>(); 
     validateFunctions.add(() -> validateEmail(reviewState.getReceiverEmail())); 
     validateFunctions.add(() -> validateReference(reviewState.getReference())); 
     //another validation methods 
     return validateFunctions; 
    } 

    private ValidateError validateEmail(String email) { 
     if (TextUtils.isEmpty(email)) { 
      return new ValidateError(Field.EMAIL);//Field.EMAIL - just enum 
     } 
     return null; 
    } 


    private ValidateError validateReference(String reference) { 
     if (TextUtils.isEmpty(reference)) { 
      return new ValidateError(Field.REFERENCE); 
     } 
     return null; 
    } 
    //.... 
    //another validation methods 
} 

सत्यापनकर्ता के लिए सार वर्ग: https://github.com/matzuk/TestableCodeMobius/tree/master/app/src/main/java/com/matsyuk/testablecodemobius/business/transfer/validation

संबंधित मुद्दे