Можно ли ждать дротика в Dart? - PullRequest
0 голосов
/ 25 октября 2019

Я новичок в Dart, и поэтому у меня проблемы с асинхронным программированием. Я пытаюсь перебрать список элементов (на данный момент давайте назовем их ингредиентами) и запросить в базе данных рецепты, которые содержат ингредиент. Чтобы добиться этого, у меня есть список ингредиентов, которые я выбрал, и передал его будущему, которое должно запросить базу данных Firestore и добавить результат в список возможных вариантов. Проблема в том, что я не могу понять, как «дождаться» окончания цикла for, прежде чем возвращать список возможных вариантов. Каждый раз, когда я запускаю его, он возвращает пустой список. Надеюсь, я не сделал это слишком сложным, и заранее спасибо всем, кто нашел время, чтобы прочитать это:)

PS: я потратил часы, чтобы найти решение этой проблемы в Интернете, но не смог ничего найти,

Future searchRecipe(ingredients) async {
    var possibleRecipes = []; //List to store results
    for (int i = 0; i < ingredients.length; ++i) {
      var currentIngredient = ingredients[i];
      //now query database for recipes with current ingredient
      var fittingRecipes = Firestore.instance
          .collection('recipes-01')
          .where('ingr.$currentIngredient', isEqualTo: true);
      fittingRecipes.snapshots().listen((data) => data.documents.forEach((doc) {
            possibleRecipes.add(doc['name']); //add names of results to the list
          }));
    }
    return possibleRecipes; //this returns an empty list
}

1 Ответ

0 голосов
/ 25 октября 2019

Да, вы можете

Просто используйте этот код

Future searchRecipe( List ingredients) async {
var possibleRecipes = []; //List to store results


 ingredients.forEach((currentIngredient) async{
//you can await anything here. e.g  await Navigator.push(context, something);
      //now query database for recipes with current ingredient
      var fittingRecipes = await Firestore.instance
          .collection('recipes-01')
          .where('ingr.$currentIngredient', isEqualTo: true);
      fittingRecipes.snapshots().listen((data) => data.documents.forEach((doc) {
            possibleRecipes.add(doc['name']); //add names of results to the list
          }));
    });
    return possibleRecipes; //this returns an empty list
}
...