Ошибка флаттера с вложенными запросами на получение firebase

#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'],  ), ); }