【问题标题】:Function returning empty list instead of List<String> [duplicate]函数返回空列表而不是 List<String> [重复]
【发布时间】:2021-10-07 07:07:48
【问题描述】:

我有一个函数接受 List&lt;File&gt; 并通过将文件上传到 firebase 存储返回 Urls(List&lt;String&gt;) 列表。

文件正在上传到存储中,并且正在为单个上传生成 URL(使用打印语句检查)。

但是当我尝试将此 URL 添加到列表中并返回列表时,该函数始终返回一个空列表。 这是我的功能:

  Future<List<String>> uploadImages(List<File> imageFiles) async {
    List<String> imageUrlList = [];
    imageFiles.forEach((File imageFile) async {
      final ref = FirebaseStorage.instance
          .ref('/tempImages')
          .child('${DateTime.now().toString()}image.jpg');
      await ref.putFile(imageFile);
      final url = await ref.getDownloadURL();
      print(url);
      imageUrlList.insert(0, url);
    });
    print(imageUrlList);
    return imageUrlList;
  }

第二个打印语句甚至没有打印到调试控制台。 有人可以帮我吗?

【问题讨论】:

  • 不是list.add()吗?
  • @sittsering list.add(...) 将添加到末尾,list.insert(0, ...) 添加到前面。
  • @sittsering list.add() 不是问题所在。不处理异步/等待行为
  • 好的,明白了

标签: firebase flutter dart google-cloud-firestore


【解决方案1】:

forEach 不会像你想象的那样工作。在 forEach 完成它的操作之前到达第二个打印语句。

您必须使用传统的for 循环才能使事情正常进行。如下所示。

Future<List<String>> uploadImages(List<File> imageFiles) async {
    List<String> imageUrlList = [];
    for(var i=0; i<imageFiles.length; i++) {
        var imageFile = imageFiles[i];
        final ref = FirebaseStorage.instance
        .ref('/tempImages')
        .child('${DateTime.now().toString()}image.jpg');
       await ref.putFile(imageFile);
       final url = await ref.getDownloadURL();
       imageUrlList.insert(0, url);
    }
    print(imageUrlList);
    return imageUrlList;
  }

它在 forEach 上不起作用的原因是,该语句只是一个函数调用。对数组方法的函数调用。所以解释器调用它并移动到下一行,即打印,然后返回。所以此时,那些图片文件还没有上传。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2023-02-16
    • 2014-07-27
    相关资源
    最近更新 更多