我正在從事一個健身專案,用戶可以在其中進行“鍛煉”,并可以讓其中的一些成為最喜歡的。用戶的練習和收藏夾存盤在 Firebase Firestore 的不同集合中。當我將練習加載到應用程式中時,當我加載它們時,我想檢查每個已被收藏的練習。我想在加載練習的同時執行此操作。所以我創建了以下代碼:
Future<void> fetchAndSetExercises() async {
final List<Exercise> loadedExercises = [];
final extracted = await _firestore.collection('exercises').get();
extracted.docs.forEach(
(exerciseData) async {
print("EXERCISE DATA: ${exerciseData['title']}");
// TODO: Get Favorite
final checkFav = await _firestore
.collection('favorites')
.doc('${_firebaseAuth.currentUser.uid}')
.collection('userFavorites')
.doc(exerciseData.id)
.get();
if (checkFav.exists) {
print('FOUND A RECORD');
}
loadedExercises.add(
Exercise(
id: exerciseData.id,
title: exerciseData['title'],
description: exerciseData['description'],
imageUrl: exerciseData['imageUrl'],
itemUrl: exerciseData['itemUrl'],
minutes: exerciseData['minutes'],
),
);
}, // end for each function
); // end for each
_exercises = loadedExercises.toList();
notifyListeners();
}
在這里,當提取的練習被加載時,我提出了另一個 get 請求。所以這段代碼中有兩個不同的 get 請求。當我在沒有第二個 firebase get 的情況下運行代碼時,它可以正常作業,但是在第二個 get 時它給出了錯誤:
RangeError(索引):無效值:有效值范圍為空:0
我一直無法為此找到任何解決方案。也許不可能將 Firebase 獲取請求嵌套到不同的集合?
如果有人可以幫助澄清這一點或指出我如何解決這個問題,我將不勝感激。
非常感謝
卡森
uj5u.com熱心網友回復:
extracted.docs.forEach(
(exerciseData) async {
forEach 方法等待您的函式完成,但您的函式是async,這意味著它會立即完成并回傳Future<>需要await編輯的 a 。但你沒有await。該forEach方法也沒有await結果。
因此,將您的代碼 usingawait從未等待的匿名方法中移出到您的代碼主體中:
for(var exerciseData in extracted.docs) {
print("EXERCISE DATA: ${exerciseData['title']}");
// TODO: Get Favorite
final checkFav = await _firestore
.collection('favorites')
.doc('${_firebaseAuth.currentUser.uid}')
.collection('userFavorites')
.doc(exerciseData.id)
.get();
if (checkFav.exists) {
print('FOUND A RECORD');
}
loadedExercises.add(
Exercise(
id: exerciseData.id,
title: exerciseData['title'],
description: exerciseData['description'],
imageUrl: exerciseData['imageUrl'],
itemUrl: exerciseData['itemUrl'],
minutes: exerciseData['minutes'],
),
);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/345329.html
