簡體   English   中英

在 flutter 中從 Firebase Firestore 收集字符串

[英]Collecting string from Firebase Firestore in flutter

我正在創建類似系統,我想從我創建的 firebase 中獲取 likeCount。

我要收集的數據

它正在收集它但返回 null,這是我的代碼:

  String? getLikecount(tresc) {
String? likeCount;
FirebaseFirestore.instance
    .collection('Posty')
    .where('Tresc', isEqualTo: tresc)
    .get()
    .then((value) => value.docs.forEach((element) async {
          var id = element.id;
         final value = await FirebaseFirestore.instance.collection('Posty').doc(id).get();
          
            likeCount = value.data()!['likeCount'].toString();
            print(likeCount);
        }));
print(likeCount);
return likeCount;
}

這是控制台 output:

控制台輸出

數據從 Firestore(和大多數現代雲 API)異步加載,因為它可能需要來自 .network 並且我們不能在等待它時阻止您的代碼(和您的用戶)。

如果我們稍微更改打印語句並格式化代碼,就會更容易看到發生了什么:

String? getLikecount(tresc) {
  String? likeCount;
  FirebaseFirestore.instance
      .collection('Posty')
      .where('Tresc', isEqualTo: tresc)
      .get()
      .then((value) => value.docs.forEach((element) async {
            var id = element.id;
            final value = await FirebaseFirestore.instance
                .collection('Posty')
                .doc(id)
                .get();

            likeCount = value.data()!['likeCount'].toString();
            print('In then: $likeCount');
          }));
  print('After then: $likeCount');
  return likeCount;
}

如果你運行它,你會看到它的輸出:

之后:null

在那時:0

這可能不是您所期望的,但它完美地解釋了為什么您得不到結果。 當您的return likeCount運行時, likeCount = value.data().['likeCount'].toString()尚未執行。

解決方案總是相同的:任何需要數據庫數據的代碼都必須在then處理程序中,從那里調用,或者以其他方式同步。

在 Flutter 中,最常見的是為此使用asyncawait 要意識到的關鍵是你現在不能返回還沒有加載的東西。 使用async / await you function 變為:

Future<String?> getLikecount(tresc) {
  String? likeCount;
  var value = await FirebaseFirestore.instance
      .collection('Posty')
      .where('Tresc', isEqualTo: tresc)
      .get();

  for (var doc in value.docs) {
    var id = element.id;
    final value = await FirebaseFirestore.instance
        .collection('Posty')
        .doc(id)
        .get();

    likeCount = value.data()!['likeCount'].toString();
    print('In then: $likeCount');
  }));

  print('After then: $likeCount');
  return likeCount;
}

現在您的代碼返回一個Future<String?> ,這樣一個值在某個時候將保存該字符串。 調用getLikecount時,您現在需要使用thenawait來處理Future ,如果您想在 UI 中顯示計數,則必須將其存儲在StatefulWidgetState中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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