Я пытаюсь создать уникальное имя пользователя для каждого пользователя в моем приложении. При регистрации я сохраняю это значение имени пользователя в отдельной коллекции («Имена пользователей»), так что проще проходить через них, когда я проверяю, является ли имя пользователя уникальным, вместо того, чтобы просматривать каждого пользователя и его поля.
На моем signup.dart у меня есть средство проверки текстового поля:
TextFormField(
style: TextStyle(fontSize: 16.0, color: Colors.white),
decoration: buildSignInInputDecoration("Username"),
validator: (value) {
if (value.length < 2 || value.isEmpty) {
return "Username is too short.";
} else if (value.length > 12) {
return "Username is too long.";
} else {
return null;
},
onSaved: (value) => _username = value.trim(),
),
}
И я сделал функцию, чтобы проверить, есть ли имя пользователя уже в коллекции: (_username - строка, в которой хранится пользовательский ввод)
Future<bool> usernameCheck() async {
final snapShot = await usernamesRef.document(_username).get();
if (snapShot == null || !snapShot.exists) {
return true; //username is unique.
} else {
return false; //username exists.
}
}
Мой вопрос: как я могу вызвать usernameCheck и проверить его с помощью моего валидатора? Заранее спасибо!
ОБНОВЛЕНИЕ: Я реализовал ответ, приведенный ниже, но каким-то образом действительный всегда возвращает false, даже если имя пользователя не существует.
Future<bool> usernameCheck(String _username) async {
final result =
await usersRef.where("username", isEqualTo: _username).getDocuments();
return result.documents.isEmpty;
}
//Gets called on sign up button pressed.
Future<void> validateAndSubmit() async {
final valid = await usernameCheck(_username);
if (!valid) {
print("Username Exists.");
} else if (validateAndSave()) {
try {
// Signs up and save data.