[英]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.