我正在使用BehaviorSubjects创建Flutter表单,并且我有一些必填字段,因此在继续下一步之前,需要检查它们。但是,其中一些还具有一些额外的要求,可以被认为是可以的,例如电子邮件字段。如果这些字段不符合要求,则在这些字段中使用流转换器(.fromHandlers)添加错误。我以为有一些“ hasError”方法可以检查BehaviorSubject,但是没有。
我目前正在通过有一个提交按钮来处理此问题,在点击该按钮时,使用一些代码来验证表单,这些代码看起来像我在转换器上拥有的Handlers方法,但是我认为这看起来不是一个好的解决方案: (
这是我的一些代码:
我如何创建主题:
Observable<String> get email => _email.stream.transform(validateEmail);
表单的提交功能:
bool submitSignUp() {
bool ok = true;
if (getEmail == null || !validEmail(getEmail)) {
ok = false;
_email.addError("* Digite um email válido");
}
if (getfullName == null || getfullName.length < 3) {
ok = false;
_fullName.addError("* Digite um nome válido");
}
if (getPassword == null || getPassword.length < 6) {
ok = false;
_password.addError("* A senha deve conter pelo menos 6 caracteres.");
}
if (getPhoneNumber == null || getPhoneNumber.length < 11) {
ok = false;
_phoneNumber.addError("* Digite um número de telefone válido");
}
return ok;
}
我的验证器看起来像这样:
final validateEmail = StreamTransformer<String, String>.fromHandlers(
handleData: (email, sink) {
RegExp emailRegExp = RegExp(
r'^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$');
if (email.isEmpty) {
sink.addError("* Campo obrigatório");
} else if (!emailRegExp.hasMatch(email)) {
sink.addError("* Digite um email válido");
} else {
sink.add(email);
}
},
);
如果存在“ hasError”方法,我可以创建一个包含所有BehaviorSubjects的列表,并进行for循环检查错误,只是返回表单是否完成。我不知道什么是应对这种情况的最佳方法。你们可以帮我吗?
答案 0 :(得分:0)
好,所以这并不是问题的真正答案,而是我所做的替代方法...
我制作了一个列表,其中包含每个可观察到的布尔值,并使用onData和onError更改列表的值,然后在按下按钮时检查所有值是否为true。我仍然不知道这是否是最好的解决方案,但是绝对比旧的解决方案好。
代码如下:
SignupOrEditBloc() {
List<Observable> observables = [
displayName,
fullName,
email,
cpf,
rg,
birthday,
cep,
address,
addressNumber,
neighborhood,
state,
city,
];
for (var i = 0; i < observables.length; i++) {
boolList.add(false);
observables[i]
.listen((_) => boolList[i] = true)
.onError((_) => boolList[i] = false);
}
}
和提交功能:
bool submitSignup() {
bool ok = true;
for (var i = 0; i < boolList.length; i++) {
ok = ok && boolList[i];
}
for (BehaviorSubject subject in subjects()) {
if (subject.value == null || subject.value == "") {
subject.addError("* Campo obrigatório");
}
}
return ok;
}