Return 不在循环内工作 Flutter/Dart
Return Not Working Inside For Loop Flutter/Dart
我正在构建的应用程序中制作注册表页面。我的问题是检查数据库以查看现有用户是否已经拥有他们尝试注册的用户名的逻辑。我获取数据库中的所有用户名并在 for 循环中循环遍历它们,并有一个 if 语句来查看是否有任何匹配,这里是相关代码:
class RegistryValidator{
static ErrorReporter validate(String userName, String password, String email){
Services.getUserName().then((value) {//value = list<User> where User is a custom object
for(var i = 0; i < value.length; i++){
print(value.elementAt(i).userName);
if (value.elementAt(i).userName == userName){
print('FOUND A DUPLICATE'); //This prints
return new ErrorReporter("Failure", "UserName already exists");
// loop ends here and continues to else block
}
}
});
if (userName.length < 3){
return new ErrorReporter("Failure", "UserName needs to be at least 3 characters long");
}
else if(userName.length > 20){
return new ErrorReporter("Failure", "UserName needs to be at under 20 characters long");
}
else if(password.length < 8){
return new ErrorReporter("Failure", "Password needs to be at least 8 characters long");
}
else if(password.length > 20){
return new ErrorReporter("Failure", "Password needs to be at under 20 characters long");
}
else if(email.length > 50){
return new ErrorReporter("Failure", "Choose a shorter email. We do not accept emails longer than 50 characters");
}
else if(!EmailValidator.validate(email)){
return new ErrorReporter("Failure", "Invalid Email, please enter a valid email");
}
else{
return new ErrorReporter("Success", "You Are Registered!");
}
}
}
ErrorReporter class:
String status;
String errorDesc = "";
ErrorReporter(this.status, this.errorDesc);
最后,在 onPressed() 内部我有:
ErrorReporter reporter = RegistryValidator.validate(userNameController.text, passwordController.text, emailController.text);
例如,如果我要输入数据库中已经存在的用户名,调用 reporter.status
应该给我“失败”,但我每次都得到“成功”。
注意:我从其他 if 语句中得到了预期的行为。但是,当通过 for 循环找到重复项时,return 似乎只适用于退出 for 循环而不是函数。谁能帮我理解为什么会这样?
感谢@jamesdlin,我弄清楚了我做错了什么。首先,return
调用在 for 循环中不起作用的原因是因为我返回到 .then()
调用而不是 .getUserName()
,但即使在修复它之后,我仍然没有得到正确的结果。那是因为我没有等待 Future/function 完成。这是通过在调用 Future 之前使用 await
关键字来完成的。对于还不太了解这一点的其他人,我发现这个网站非常有帮助:https://dart.dev/codelabs/async-await
我正在构建的应用程序中制作注册表页面。我的问题是检查数据库以查看现有用户是否已经拥有他们尝试注册的用户名的逻辑。我获取数据库中的所有用户名并在 for 循环中循环遍历它们,并有一个 if 语句来查看是否有任何匹配,这里是相关代码:
class RegistryValidator{
static ErrorReporter validate(String userName, String password, String email){
Services.getUserName().then((value) {//value = list<User> where User is a custom object
for(var i = 0; i < value.length; i++){
print(value.elementAt(i).userName);
if (value.elementAt(i).userName == userName){
print('FOUND A DUPLICATE'); //This prints
return new ErrorReporter("Failure", "UserName already exists");
// loop ends here and continues to else block
}
}
});
if (userName.length < 3){
return new ErrorReporter("Failure", "UserName needs to be at least 3 characters long");
}
else if(userName.length > 20){
return new ErrorReporter("Failure", "UserName needs to be at under 20 characters long");
}
else if(password.length < 8){
return new ErrorReporter("Failure", "Password needs to be at least 8 characters long");
}
else if(password.length > 20){
return new ErrorReporter("Failure", "Password needs to be at under 20 characters long");
}
else if(email.length > 50){
return new ErrorReporter("Failure", "Choose a shorter email. We do not accept emails longer than 50 characters");
}
else if(!EmailValidator.validate(email)){
return new ErrorReporter("Failure", "Invalid Email, please enter a valid email");
}
else{
return new ErrorReporter("Success", "You Are Registered!");
}
}
}
ErrorReporter class:
String status;
String errorDesc = "";
ErrorReporter(this.status, this.errorDesc);
最后,在 onPressed() 内部我有:
ErrorReporter reporter = RegistryValidator.validate(userNameController.text, passwordController.text, emailController.text);
例如,如果我要输入数据库中已经存在的用户名,调用 reporter.status
应该给我“失败”,但我每次都得到“成功”。
注意:我从其他 if 语句中得到了预期的行为。但是,当通过 for 循环找到重复项时,return 似乎只适用于退出 for 循环而不是函数。谁能帮我理解为什么会这样?
感谢@jamesdlin,我弄清楚了我做错了什么。首先,return
调用在 for 循环中不起作用的原因是因为我返回到 .then()
调用而不是 .getUserName()
,但即使在修复它之后,我仍然没有得到正确的结果。那是因为我没有等待 Future/function 完成。这是通过在调用 Future 之前使用 await
关键字来完成的。对于还不太了解这一点的其他人,我发现这个网站非常有帮助:https://dart.dev/codelabs/async-await