我有一個帶有“創建帳戶”表單的 Flutter 應用程式,其中包含一個用戶名欄位。輸入用戶名并點擊“提交”按鈕后,我的驗證器功能會為表單運行。我想查詢我的 Firestore 資料庫并確保輸入的用戶名尚未被占用。
我的validator(以用戶名形式):
validator: (value) {
Future<bool> usernameTaken = uniqueCheck(value);
if (usernameTaken) {
return 'Username is already taken!';
} else {
return null;
}
我的uniqueCheck功能:
Future<bool> uniqueCheck(String? value) async {
bool alreadyTaken = false;
var snapshot = await FirebaseFirestore.instance
.collection('users')
.where('username', isEqualTo: value)
.get();
snapshot.docs.forEach((result) {
alreadyTaken = true;
});
return alreadyTaken;
}
問題是在我的函式可以回傳正確的結果之前我validator完成了(例如,如果用戶名被占用并且是。我認為會解決這個問題,但顯然不是。uniqueCheckusernameTakentrueawait
我在這里做錯了什么?
uj5u.com熱心網友回復:
嘗試這個:
validator: (value) async {
Future<bool> usernameTaken = await uniqueCheck(value);
if (usernameTaken) {
return 'Username is already taken!';
} else {
return null;
}
}
uj5u.com熱心網友回復:
解決方案:我想通了。驗證器不能是異步的,所以解決方案是在提交按鈕的uniqueCheck函式中呼叫該函式onPressed。然后我可以正確await地查看電子郵件是否被占用,然后我打電話setState(){}重新繪制螢屏。
onPressed: () async {
emailTaken = await uniqueCheck(emailKey.currentState!.value);
setState(() {});
if (formKey.currentState!.validate()) {
formKey.currentState?.save();
// {... add to database ...}
// {... navigate to successful sign-in screen ...}
}
},
請注意,emailTakenbool 對該范圍是全域的,因此當setState(){}被呼叫時,validator電子郵件欄位中的 會將其視為真。
電子郵件欄位表單驗證器功能:
validator: (value) {
if ((value!.isEmpty) | !(value.contains('@'))) {
return 'Please enter a valid email address.';
} else if (emailTaken) {
return 'Email is already taken!';
} else {
return null;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/333928.html
標籤:火力基地 扑 镖 谷歌云firestore 异步等待
上一篇:firebase-如何將軟體安裝到我已部署到的服務器上?
下一篇:允許根據檔案fileld的值寫入
