Возврат, не работающий внутри для прерывания цикла / Dart

#flutter #for-loop #dart #return #logic

#прерывание #для цикла #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:

 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, а не функции. Кто-нибудь может помочь мне понять, почему он действует таким образом?

Комментарии:

1. Ваш return оператор возвращает результат обратного вызова , который вы предоставили .then() , а не из вашей validate() функции, и вы никогда не используете возвращаемое значение. Кроме того, ваша validate функция вызывает асинхронную функцию, но не ожидает ее завершения и не возвращает Future .

2. Спасибо за это! Я исправил первую часть, но я все еще пытаюсь разобраться со второй.

Ответ №1:

Благодаря @jamesdlin я понял, что я делал неправильно. Во-первых, причина, по которой return вызов не работал в цикле for, заключалась в том, что я возвращался к .then() вызову вместо .getUserName() , но даже после исправления этого я все еще не получал правильных результатов. Это потому, что я не ждал завершения Future / function. Это достигается с помощью await ключевого слова перед вызовом вашего Future. Для всех, кто еще не совсем понимает это, я нашел этот сайт очень полезным:https://dart.dev/codelabs/async-await