如何从其功能外部更改验证器状态



我为注册创建了一个视图模型,里面有我的验证器。

String? emailValidator(String? s) {
if(s == null || s.isEmpty || s.isWhiteSpace()){
return "Email is required";
}
if(!s.isValidEmail()){
return "Invalid email address";
}
return null;
}

当我创建一个帐户时,我调用createUserWithEmailAndPassword,但是当用户已经存在时,这会抛出一个异常。

onPressed: () {                  
final isValid = formKey.currentState!.validate();
assert(isValid == viewModel.isValid(),
"The view model and form must agree on whether the form is valid");
if(isValid && viewModel.isValid()){
try{
FirebaseAuth.instance.createUserWithEmailAndPassword(email: viewModel.email!, password: viewModel.password!);
}catch{
// what should I do here?
}
}
},

现在我想捕获它并更新我的验证器,以便我可以显示像"电子邮件地址已在使用"这样的错误。我该怎么做呢?

创建bool

bool emailExists = false;
String? emailValidator(String? s) {
if(s == null || s.isEmpty || s.isWhiteSpace()){
return "Email is required";
}
if(!s.isValidEmail()){
return "Invalid email address";
}
if(emailExists) return "Registered Email Exists";
return null;
}

和在catch中按下按钮,您可以更新bool并再次验证

onPressed: () {                  
final isValid = formKey.currentState!.validate();
assert(isValid == viewModel.isValid(),
"The view model and form must agree on whether the form is valid");
if(isValid && viewModel.isValid()){
try{
FirebaseAuth.instance.createUserWithEmailAndPassword(email: viewModel.email!, password: viewModel.password!);
}catch{
emailExists = true;
formKey.currentState!.validate();
}
}
},

由于您要使用try/catch,因此处理异常的语法为:

try {
await FirebaseAuth.instance.createUserWithEmailAndPassword(
email: "sparky@firebaseexample.com",
password: "CorrectHorseBatteryStaple"
);
} on FirebaseAuthException catch (e) {
print("Caught FirebaseAuthException");
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(e.code+'nnn'+e.message!))
);                            
} catch (e) {
print("Caught other error");
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(e.toString()))
);                            
}

您可能只需要处理FirebaseAuthExceptions的第一个catch块,并且在那里您可以使用e.code来确定Firebase的实际错误代码。有关实际代码,请参阅Flutter Firebase验证异常的错误代码是什么?

我们做了一集关于这个主题的Flutter Boring Show前一段时间,所以我建议检查一下:Firebase Authentication in Flutter (the Boring Flutter Development Show, Ep. 55),也可以看到我们在那里创建的最终代码。

最新更新