簡體   English   中英

Flutter,等待firebase數據時如何處理狀態

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM