#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