【发布时间】:2020-01-07 07:54:17
【问题描述】:
我正在使用 BehaviorSubjects 创建一个 Flutter 表单,并且我有一些必填字段,因此我需要在继续下一个表单步骤之前检查它们。但是,其中一些还需要考虑一些额外的要求,例如电子邮件字段。如果它们不符合要求,我在这些字段中使用流转换器 (.fromHandlers) 添加错误。我认为有一些“hasError”方法可以检查 BehaviorSubject,但没有。
我目前正在通过一个提交按钮来处理这个问题,当点击该按钮时,使用一些看起来像我在转换器上的处理程序方法的代码来验证表单,但我认为它看起来不是一个好的解决方案: (
这是我的一些代码:
我如何创建我的主题:
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 循环检查错误,只返回表单是否已完成。我不知道处理这种情况的最佳方法是什么。你们能帮帮我吗?
【问题讨论】:
-
@pskink 感谢您的链接,它帮助我找到了解决方案 :)
-
当然,欢迎您
-
如果你想为每个字段和表单使用流,你可以检查github.com/GiancarloCode/form_bloc/tree/master/packages/…