[英]how to fix E/flutter (15862): Unhandled Exception: Bad state: No element when push data to firebase in flutter?
[英]Flutter, How handle state when awaiting for firebase data
checkBorrowerAlreadyExists()
函數檢查用戶輸入名稱是否已存在於 firebase 數據中並返回一個布爾值。 我在onPressed
按鈕后的 if 條件下使用此函數,我在 if 條件下將用戶輸入作為參數提供給函數,並根據 bool 值顯示小吃欄。 當firebase已經有數據時,這工作得很好,但最初當用戶注冊並打開應用程序時,firebase不會有任何數據來檢查名稱是否已經存在並且屏幕上沒有任何反應。
如果沒有數據,我使用 else 條件返回 false,繼續並在 firebase 中添加輸入,但沒有用。 我也嘗試以不同的方式使用布爾,但沒有奏效。 我該如何解決這個問題。
checkBorrowerAlreadyExists(String textfieldname) async {
await for (var snapshots in _firestorem
.collection('lender')
.doc(auth.currentUser?.uid)
.collection('borrowers')
.snapshots()) {
for (var message in snapshots.docs) {
bool isThere;
if (message.data().containsValue(textfieldname)) {
return isThere = true;
} else {
return isThere = false;
}
}
}
}
onPressed: () async {
if (borrowerNameController.text.isEmpty) {
Get.snackbar(
'Error:', "Borrower Name can't be empty",
backgroundColor: Colors.red);
} else if (await checkBorrowerAlreadyExists(
borrowerNameController.text)) {
Get.snackbar('Error',
'Borrower Name alread exists, Enter new name',
backgroundColor: Colors.red);
} else{ upload data in firebase}
您不能在build
方法中使用await
,因為沒有辦法阻止渲染。
解決方案實際上是在你的函數的返回類型中,你隱含的不是。 如果你明確返回類型,它是:
Future<bool> checkBorrowerAlreadyExists(String textfieldname) async {
...
由於這會返回Future
,因此您需要在build
方法中使用FutureBuilder
來呈現布爾值(並確定在該值可用之前要呈現的內容)。
所以像:
onPressed: () async {
if (borrowerNameController.text.isEmpty) {
Get.snackbar('Error:', "Borrower Name can't be empty", backgroundColor: Colors.red);
}
else {
return FutureBuilder<String>(
future: checkBorrowerAlreadyExists(),
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
List<Widget> children;
if (snapshot.hasData) {
return Text(borrowerNameController.text)
} else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}'),
} else {
return Text('Awaiting result...'),
}
},
),
我建議查看有關FutureBuilder
和 Flutter 的異步編程代碼實驗室的文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.