首页 > 解决方案 > 带有 Flutter 的 Firebase 中的唯一用户名

问题描述

我正在尝试为我的应用程序上的每个用户创建一个唯一的用户名。在注册时,我将该用户名值存储在一个单独的集合(“用户名”)中,因此当我检查用户名是否唯一时,更容易通过它们,而不是通过每个用户及其字段。

在我的 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 并使用我的验证器对其进行验证?提前致谢!

更新:我实现了下面给出的答案,但不知何故,即使用户名不存在,valid 总是返回 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.

标签: firebaseflutterdartgoogle-cloud-firestorefirebase-authentication

解决方案


您不能在验证器函数中执行异步操作。你可以做的是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;
  }

推荐阅读