Уникальное имя пользователя в Firebase с Flutter - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь создать уникальное имя пользователя для каждого пользователя в моем приложении. При регистрации я сохраняю это значение имени пользователя в отдельной коллекции («Имена пользователей»), так что проще проходить через них, когда я проверяю, является ли имя пользователя уникальным, вместо того, чтобы просматривать каждого пользователя и его поля.

На моем 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.

1 Ответ

0 голосов
/ 09 октября 2019

Вы не можете выполнять асинхронные операции внутри функции валидатора. Что вы можете сделать, это позвонить checkUsername() до вызова валидатора, скажем, у вас есть кнопка, и когда пользователь нажимает на нее, вы вызываете валидатор, у вас будет что-то вроде этого.

onPressed: () async {
    final valid = await usernameCheck();
    if (!valid) {
        // username exists
    }
    else if (_formKey.currentState.validate()) {
         // save the username or something
    }
}

Кроме того, вам не нужно хранить имена пользователей в отдельной коллекции, вы можете хранить их только в основной коллекции, скажем, users, и редактировать checkUsername() следующим образом:

 Future<bool> usernameCheck(String username) async {
    final result = await Firestore.instance
        .collection('users')
        .where('username', isEqualTo: username)
        .getDocuments();
    return result.documents.isEmpty;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...