简体   繁体   English

Flutter - Bloc - 比较两个 TextFields password 和 passwordConfirm 的问题

[英]Flutter - Bloc - Issue with comparing two TextFields password and passwordConfirm

I'm a flutter begginer.我是一个颤振初学者。 I'm using Bloc and I was able to validate individual Texfields but I had some doubts trying to compare two TextFields (password and passwordConfirm).我正在使用 Bloc 并且我能够验证单个 Texfields,但是在尝试比较两个 TextFields(password 和 passwordConfirm)时我有一些疑问。 I'm using BehaviorSubject() as controller and Rx.dart but I can't find the way to link them.我使用 BehaviorSubject() 作为控制器和 Rx.dart,但我找不到链接它们的方法。 I tried to use a StreamTransformer too but I couldn't input more than one value.我也尝试使用 StreamTransformer,但我无法输入多个值。

final validatePasswordConfirm = StreamTransformer<String,String>
   .fromHandlers(handleData: (passwordConfirm, sink) {});

Here's the rest of the code (part of the register_page.dart, register_bloc.dart and validators.dart):下面是代码的其余部分(register_page.dart、register_bloc.dart 和 validators.dart 的一部分):

// register_page.dart
    
Widget create_password(RegisterBloc bloc){
        return StreamBuilder(
            stream: bloc.passwordStream,
            builder: (BuildContext context, AsyncSnapshot snapshot) {
              return Container(
                padding: EdgeInsets.symmetric(horizontal: 20.0),
                child: TextField(
                  obscureText: true,
                  decoration: InputDecoration(
                      icon: Icon(Icons.lock, color: Colors.deepPurple),
                      labelText: 'password',
                      counterText: snapshot.data,
                      errorText: snapshot.error
                  ),
                  onChanged: (value) => bloc.changePassword(value),
                ),
              );
            },
         );
      }
    
      Widget create_password_confirm(RegisterBloc bloc){
        return StreamBuilder(
          stream: bloc.validatePasswordConfirmStream,
          builder: (BuildContext context, AsyncSnapshot snapshot) {
            return Container(
              padding: EdgeInsets.symmetric(horizontal: 20.0),
              child: TextField(
                obscureText: true,
                decoration: InputDecoration(
                    icon: Icon(Icons.lock, color: Colors.deepPurple),
                    labelText: 'password Confirm',
                    counterText: snapshot.data,
                    errorText: snapshot.error
                ),
                onChanged: (value) => bloc.changePasswordConfirm(value),
              ),
            );
          },
        );
      }
    // register_bloc.dart
    class RegisterBloc with Validators{
    
      final _usernameController = BehaviorSubject<String>();
      final _emailController = BehaviorSubject<String>();
      final _passwordController = BehaviorSubject<String>();
      final _passwordConfirmController = BehaviorSubject<String>();
    
    
      Stream<String> get usernameStream => _emailController.stream.transform(validatePassword);
      Stream<String> get emailStream => _emailController.stream.transform(validateEmail);
      Stream<String> get passwordStream => _passwordController.stream.transform(validatePassword);
      Stream<String> get passwordConfirmStream => _passwordConfirmController.stream.transform(validatePasswordConfirm);
    
    
      Stream<String> get validatePasswordConfirmStream => Rx.combineLatest2(passwordStream, passwordConfirmStream,
              (p, pc){
            return p.compareTo(pc)? p.passwordStream:'passwords does not match';
          });
    
      Stream<bool> get formValidStream =>
          Rx.combineLatest4(usernameStream, emailStream, passwordStream, passwordConfirmStream, (u,e,p, pc) => true);
    
      Function(String) get changeUsername => _usernameController.sink.add;
      Function(String) get changeEmail => _emailController.sink.add;
      Function(String) get changePassword => _passwordController.sink.add;
      Function(String) get changePasswordConfirm => _passwordConfirmController.sink.add;
    
    
      String get username => _usernameController.value;
      String get email => _emailController.value;
      String get password => _passwordController.value;
      String get passwordConfirm => _passwordController.value;
    
      dispose() {
        _usernameController?.close();
        _emailController?.close();
        _passwordController?.close();
        _passwordConfirmController?.close();
      }
    }
    // validators.dart
    class Validators{
      final validateEmail = StreamTransformer<String,String>.fromHandlers(
          handleData: (email, sink) {
            Pattern pattern = r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$';
            RegExp regExp = new RegExp(pattern);
            if (regExp.hasMatch(email)) {
              sink.add(email);
            } else {
              sink.addError('Email no es correcto');
            }
          }
      );
    
      final validatePassword = StreamTransformer<String,String>.fromHandlers(
        handleData: (p, sink){
          if(p.length >= 6) {
            sink.add(p);
          } else {
            sink.addError('Más de 6 caracteres por favor');
          }
        }
      );
    
      final validatePasswordConfirm = StreamTransformer<String,String>.fromHandlers(
          handleData: (passwordConfirm, sink) {});
    }

Thanks in advance and sorry for my bad english.在此先感谢并为我的英语不好而感到抱歉。 Greetings, Mariano问候,马里亚诺

Finally after a few hours I could find the answer of my question.几个小时后,我终于找到了问题的答案。 Now I can compare two textFields and if they don't match each other I will send to passwordConfirm textField an error message.现在我可以比较两个 textFields,如果它们彼此不匹配,我将向 passwordConfirm textField 发送一条错误消息。

Stream<String> get passwordConfirmStream => _passwordConfirmController.stream
      .transform(validatePassword).doOnData((String c){
    if (0 != _passwordController.value.compareTo(c)){
      _passwordConfirmController.addError("No Match");
    }
  }); 

Greetings, Mariano问候,马里亚诺

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM