#flutter #dart #flutter-dependencies
Вопрос:
Я работаю над фитнес-проектом, где пользователь выполняет «упражнения» и может сделать некоторые из них любимыми. Упражнения и Избранное пользователем хранятся в разных коллекциях в Firebase Firestore. Когда я загружаю упражнения в приложение, по мере их загрузки я хочу проверять каждое упражнение, которое было выбрано. Я хочу делать это одновременно с выполнением упражнений. Поэтому я создал следующий код:
Futurelt;voidgt; fetchAndSetExercises() async { final Listlt;Exercisegt; 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. Когда я запускаю код без второго get firebase, он работает нормально, но со вторым get он выдает ошибку:
RangeError (index): Invalid value: Valid value range is empty: 0
Я не смог найти для этого никакого решения. Возможно, невозможно вложить запросы Firebase get в разные коллекции…
Если бы кто-нибудь мог помочь прояснить это или указать, как я могу это решить?
Комментарии:
1. Пожалуйста, не используйте заглавные буквы для названия
Ответ №1:
extracted.docs.forEach( (exerciseData) async {
Метод forEach ожидает завершения вашей функции, но ваша функция есть async
, что означает, что она завершается немедленно и возвращает Futurelt;gt;
значение, которое необходимо изменить await
. Но ты этого не await
делаешь . forEach
метод также не await
дает результатов.
Поэтому переместите свой код, используя await
анонимный метод, который не ожидается, в основную часть кода:
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'], ), ); }