从 Firebase Storage 获取多个图片下载 URL——我可以成功上传多个图片

Get multiple Image download URLs from Firebase Storage- I can successfully upload multiple images

我正在尝试一次将多张图片上传到 firebase 存储。我可以成功上传但无法检索下载 URLs;

Future<void> saveImages() async {
    int index = images.length;
    setState(() {
      isLoading = true;
    });

    try {
      final ref = FirebaseStorage.instance
          .ref()
          .child('images/${FirebaseAuth.instance.currentUser!.uid}');
      images.forEach((element) async {
        final file = await element.file;
        final refPut = ref.child('$element$index');
        await refPut.putFile(
          File(file!.path),
        );
      });
      final ref2 = ref.child('${imagePciker.path.split('/')}');
      await ref2.putFile(File(imagePciker.path));
      final ListResult listData = await ref.listAll();
      final data =await ref2.getDownloadURL();
      print('Im HERE!=Line 95');
      Future.forEach(listData.items, (Reference element) async {
        await element.getDownloadURL().then((value) => listUrls.add(value));
        print('line 101');
        print(listUrls.length);
      });

      print('Line 104');
      await FirebaseFirestore.instance.collection('test').add({
        'titleDownloadUrl': data,
        'ListOfDownloadUrl': listUrls,
      });
      print('Line 108');
      setState(() {
        isLoading = false;
      });
    } catch (e) {
   /*    setState(() {
        isLoading = false;
      }); */
      print(e);
    }
  }

打印语句用于调试。整个函数 returns 并没有抛出任何错误。 但是在 firebase 集合 'test' 中 URL 没有正确存储。

在first/fresh运行重启应用后 ListOfDownloadUrl 数组为空

热重启(没有图像保存在 firebase 存储中) ListOfDownloadUrl 数组有一个 URL

然后在多次重启后,URL 秒的保存量变得巨大(即上传了 4 张图像 - 保存了 10 URL 秒)。

如果我需要添加任何其他内容,请评论; 感谢您的帮助

.forEach() 不是异步的——它不会等待。使用 await Promise.all(images.map())(从而创建一个承诺数组,必须全部解决)。

已解决!

跟随@LeadDreamer的思路

forEach 不是异步的,他的回答的问题是 flutter 没有

Promise.all()

如果 Future.wait(),它的作用(在我的例子中)是一样的。

Future<void> saveImages() async {
    int index = images.length;
    setState(() {
      isLoading = true;
    });

    try {
      final refMain = FirebaseStorage.instance
          .ref()
          .child('images${FirebaseAuth.instance.currentUser!.uid}');
      AssetEntity eleId =
          new AssetEntity(id: '', typeInt: 5, width: 5, height: 5);

      await Future.wait(images.map((element) async { <-- here instead of the for each
        setState(() {
          eleId = element;
        });
        final file = await element.file;
        final refPut = refMain.child('suportImage$_counter/$element$index');
        await refPut.putFile(
          File(file!.path),
        );
      }));

      final ref2 =
          refMain.child('headingImage$_counter/${imagePciker.path.split('/')}');
      await ref2.putFile(File(imagePciker.path));
      final ListResult listData =
          await refMain.child('suportImage$_counter').listAll();
      final data = await ref2.getDownloadURL();
      await Future.wait(listData.items.map((e) async { <-- here instead of for each
        await e.getDownloadURL().then((value) => listUrls.add(value));
      }));