【问题标题】:Return Not Working Inside For Loop Flutter/Dart循环颤振/飞镖内部返回不起作用
【发布时间】:2020-12-28 11:17:27
【问题描述】:

我正在我正在构建的应用程序中创建一个注册表页面。我的问题是检查数据库以查看现有用户是否已经拥有他们尝试注册的用户名的逻辑。我获取数据库中的所有用户名并在 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 类:

String status;
String errorDesc = "";
ErrorReporter(this.status, this.errorDesc);

最后,在 onPressed() 里面我有:

ErrorReporter reporter = RegistryValidator.validate(userNameController.text, passwordController.text, emailController.text);

例如,如果我要输入数据库中已经存在的用户名,调用 reporter.status 应该给我“失败”,但我每次都得到“成功”。

注意:我从其他 if 语句中得到了预期的行为。但是,当通过 for 循环找到重复项时,返回似乎仅适用于退出 for 循环而不是函数。谁能帮我理解它为什么会这样?

【问题讨论】:

  • 您的return 语句从您提供给.then()回调 返回,而不是从您的validate() 函数返回,并且您从不使用返回值。此外,您的 validate 函数调用异步函数,但不等待它完成并且不返回 Future
  • 谢谢!我修复了第一部分,但我仍在尝试找出第二部分。

标签: flutter for-loop dart return logic


【解决方案1】:

感谢@jamesdlin,我知道我做错了什么。首先,return 调用在 for 循环中不起作用的原因是我返回到 .then() 调用而不是 .getUserName(),但即使在修复它之后,我仍然没有得到正确的结果。那是因为我没有等待 Future/function 完成。这是通过在调用 Future 之前使用 await 关键字来完成的。对于其他还不太了解这一点的人,我发现这个网站非常有帮助:https://dart.dev/codelabs/async-await

【讨论】:

    猜你喜欢
    • 2022-06-20
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2022-01-21
    • 2020-12-25
    • 2020-11-05
    • 2019-05-07
    • 2021-03-11
    相关资源
    最近更新 更多