[英]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 中,最常見的是為此使用async
和await
。 要意識到的關鍵是你現在不能返回還沒有加載的東西。 使用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
時,您現在需要使用then
或await
來處理Future
,如果您想在 UI 中顯示計數,則必須將其存儲在StatefulWidget
的State
中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.