(颤振/飞镖)在从Firebase Firestore检索时从Firebase存储检索,异步内异步

(颤振/飞镖)在从Firebase Firestore检索时从Firebase存储检索,异步内异步,firebase,flutter,dart,google-cloud-firestore,async-await,Firebase,Flutter,Dart,Google Cloud Firestore,Async Await,我正在尝试根据从Firebase Firestore检索的文档id从Firebase存储检索图像。我遇到了一个问题,因为每个实例都返回一个未来,并且需要单独的等待/异步 我不能使用Future.wait(),因为我需要Firestore中的第一个异步用于第二个异步,但我还需要在第一个异步完成之前启动第二个异步(我不知道异步是如何工作的)。我尝试在一个异步函数中创建一个异步函数,该函数的行为与普通函数一样(先运行外部异步函数,然后运行内部异步函数) 静态未来getFirebaseRecipes()

我正在尝试根据从Firebase Firestore检索的文档id从Firebase存储检索图像。我遇到了一个问题,因为每个实例都返回一个未来,并且需要单独的等待/异步

我不能使用
Future.wait()
,因为我需要Firestore中的第一个异步用于第二个异步,但我还需要在第一个异步完成之前启动第二个异步(我不知道异步是如何工作的)。我尝试在一个异步函数中创建一个异步函数,该函数的行为与普通函数一样(先运行外部异步函数,然后运行内部异步函数)

静态未来getFirebaseRecipes()异步{
CollectionReference recipesDatabase=FirebaseFirestore.instance.collection('recipes');
列表配方=新列表();
recipesDatabase.get().then((querySnapshot)=>querySnapshot.docs.map((doc)异步{
Reference ref=FirebaseStorage.instance.ref().child('recipeimages');
字符串url=await ref.child(doc.id+'.jpg').getDownloadURL();
recipes.add(Recipe.fromdmap(doc.id,url,doc.data());
}));
返回食谱;
}
这就是我希望能够做到的,但显然无法使用它,因为第二个没有异步函数:

static Future<String> getImageURL(String dbId) async {
    Reference ref = FirebaseStorage.instance.ref().child('recipeimages');
    return await ref.child(dbId + '.jpg').getDownloadURL();
  }

static Future<List<Recipe>> getFirebaseRecipes() async {
    CollectionReference recipesDatabase = FirebaseFirestore.instance.collection('recipes');

    return recipesDatabase.get().then((querySnapshot) => querySnapshot.docs.map((doc) => Recipe.fromDBMap(doc.id, await getImageURL(doc.id), doc.data), doc.data())).toList());
  }
静态未来getImageURL(字符串dbId)异步{
Reference ref=FirebaseStorage.instance.ref().child('recipeimages');
return wait ref.child(dbId+'.jpg').getDownloadURL();
}
静态未来getFirebaseRecipes()异步{
CollectionReference recipesDatabase=FirebaseFirestore.instance.collection('recipes');
返回recipesDatabase.get().then((querySnapshot)=>querySnapshot.docs.map((doc)=>Recipe.fromdmap(doc.id,wait getImageURL(doc.id),doc.data),doc.data()).toList());
}
如果有人对如何从firebase存储中检索对象(甚至如何在Firestore中存储和映像)有任何提示或其他方法,我将非常感谢您的帮助

尝试以下操作:

static Future<List<Recipe>> getFirebaseRecipes() async {
    CollectionReference recipesDatabase = FirebaseFirestore.instance.collection('recipes');

    List<Recipe> recipes = new List();
    var querySnapshot = await recipesDatabase.get();
      querySnapshot.docs.map((doc) async {
        Reference ref = FirebaseStorage.instance.ref().child('recipeimages');
        String url = await ref.child(doc.id + '.jpg').getDownloadURL();
        recipes.add(Recipe.fromDBMap(doc.id, url, doc.data()));
     }));   
    return recipes;
}
静态未来getFirebaseRecipes()异步{
CollectionReference recipesDatabase=FirebaseFirestore.instance.collection('recipes');
列表配方=新列表();
var querySnapshot=await recipesDatabase.get();
querySnapshot.docs.map((doc)异步{
Reference ref=FirebaseStorage.instance.ref().child('recipeimages');
字符串url=await ref.child(doc.id+'.jpg').getDownloadURL();
recipes.add(Recipe.fromdmap(doc.id,url,doc.data());
}));   
返回食谱;
}
您需要使用
wait
等待firestore从数据库检索所有数据,然后您可以使用结果获取下载URL。

尝试以下操作:

static Future<List<Recipe>> getFirebaseRecipes() async {
    CollectionReference recipesDatabase = FirebaseFirestore.instance.collection('recipes');

    List<Recipe> recipes = new List();
    var querySnapshot = await recipesDatabase.get();
      querySnapshot.docs.map((doc) async {
        Reference ref = FirebaseStorage.instance.ref().child('recipeimages');
        String url = await ref.child(doc.id + '.jpg').getDownloadURL();
        recipes.add(Recipe.fromDBMap(doc.id, url, doc.data()));
     }));   
    return recipes;
}
静态未来getFirebaseRecipes()异步{
CollectionReference recipesDatabase=FirebaseFirestore.instance.collection('recipes');
列表配方=新列表();
var querySnapshot=await recipesDatabase.get();
querySnapshot.docs.map((doc)异步{
Reference ref=FirebaseStorage.instance.ref().child('recipeimages');
字符串url=await ref.child(doc.id+'.jpg').getDownloadURL();
recipes.add(Recipe.fromdmap(doc.id,url,doc.data());
}));   
返回食谱;
}

您需要使用
wait
等待firestore从数据库检索所有数据,然后您可以使用结果获取下载URL。

上传完成后,为什么不将图像下载URL存储到其文档中,这样你就不必每次都查询它的URL为什么不能使用第一个代码段?@PeterHaddad我尝试过使用它,但它在第二次等待完成之前就完成了执行,所以它会在返回后将对象添加到列表中。上传完成后,为什么不将图像下载URL存储到它的文档中,这样你就不必每次都查询它的URL了为什么你不能使用第一个代码段?@PeterHaddad我尝试过使用它,但它在第二次等待完成之前就完成了执行,所以它会在返回后将对象添加到列表中。嗯,我试过了,它也不会在其中执行等待。最后我只是将存储连接到Firestore,所以只需要一个异步函数。嗯,我尝试了这个,但它也没有在内部执行等待。我最终只是将存储连接到Firestore,因此只需要一个异步函数。