Как проверить базу ввода на значении другого поля ввода, используя преобразователи потока во флаттере

У меня есть форма регистрации с полями электронной почты, пароля и подтверждения пароля. Чего я хочу добиться, так это правильно проверить входные данные. Пока я использую наивный алгоритм для проверки электронной почты и пароля, и это хорошо. Для поля подтверждения пароля я хочу, чтобы оно соответствовало критериям действительного пароля, и значение должно совпадать со значением пароля. Должен ли я использовать потоковое преобразование или совершенно другой подход?

БЛОК АУТЕНТИФИКАЦИИ

  final _emailTFController = TextEditingController();
  final _passwordTFController = TextEditingController();
  final _confirmPasswordTFController = TextEditingController();

  Stream<String> get emailStream =>
      _emailController.stream.transform(Validators.validateEmail);

  Stream<String> get passwordStream =>
      _passwordController.stream.transform(Validators.validatePassword);

ВАЛИДАТОРЫ

import 'dart:async';

class Validators {
  static final validateEmail =
      StreamTransformer<String, String>.fromHandlers(handleData: (email, sink) {
    if (email.contains('@')) {
      sink.add(email);
    } else {
      sink.addError('Enter a valid email');
    }
  });

  static final validatePassword = StreamTransformer<String, String>.fromHandlers(
      handleData: (password, sink) {
    if (password.length > 4) {
      sink.add(password);
    } else {
      sink.addError('Invalid passord, please enter more than 4 characters.');
    }
  });
}

person cdaiga    schedule 12.12.2019    source источник
comment
Могу я спросить, откуда взялся метод .stream? Как вы превращаете TextEditingController в поток?   -  person Daniel Oliveira    schedule 17.12.2019
comment
Потоки поступают от контроллеров потоков, а не от контроллеров редактирования текста, как показано в первой части кода. Контроллерами потока являются объекты rxdart Subject, а точнее Behavior Subject.   -  person cdaiga    schedule 18.12.2019


Ответы (1)


Используйте BehaviourSubject вместо Stream Controller

final passwordController=BehaviorSubject<String>();

И используйте функцию ConfirmPassword с методом doOnData, как показано ниже.

Stream<String> get confirmpassword =>
      confirmpasswordController.stream.transform(confirmPasswordValidator)
          .doOnData((String c){
        // If the password is accepted (after validation of the rules)
        // we need to ensure both password and retyped password match
        if (0 != passwordController.value.compareTo(c)){
          // If they do not match, add an error
          confirmpasswordController.addError("Confirm Password donot match");
        }
      });
person bilal    schedule 17.10.2020