firebase - 带有 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.
解决方案
您不能在验证器函数中执行异步操作。你可以做的是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;
}
推荐阅读
- mysql - 如何在 SQL 表上有一列包含用户每天执行的最后一次操作的时间?
- javascript - 构建动态的更好方法
- java - 插入操作在我的 Maven 项目中不起作用
- r - Step_dummy。处理由 recipe() 步骤生成的重复列名,Tidymodels
- javascript - 我可以将 HTML 属性传递给 *ngIf 中的函数吗?
- excel - VBA "Variable required. Can't assign to this expression" error - Goal-seek analysis
- javascript - 通过纯 Javascript 使用类、标题、段落、编号和删除按钮在单击时创建 div
- database - 通过 hyper 使用 mongoDB 的设置不起作用
- flutter - 横幅 Google 广告未显示 - 广告加载失败:LoadAdError(代码:3,域:com.google.android.gms.ads,消息:无广告配置。)
- c# - 在 Entity Framework 6 下工作的查询在 .Net5 中不起作用