Flutter:处理异步操作

时间:2020-01-20 21:23:15

标签: flutter dart

我有一个异步功能,可以将文件上传到Firebase存储。我正在尝试通过字符串列表返回为每个文件检索的下载URL。但是,我遇到的问题是该函数在完成异步操作之前先执行return行。

我的代码如下:

Future<List<String>> uploadAssets() async {
    List<String> downloadUrls = List<String>();
    if (assets.isNotEmpty && !textOnly) {
      assets.forEach((asset) async {
        if (asset.runtimeType == Asset) {
          ByteData byteData = await asset.requestOriginal(quality: 85);
          List<int> assetData = byteData.buffer.asUint8List();
          StorageUploadTask uploadTask = storageRef
            .child('post_${Uuid().v4()}.jpg')
            .putData(assetData);
          StorageTaskSnapshot storageSnap = await uploadTask.onComplete;
          String downloadUrl = await storageSnap.ref.getDownloadURL();
          downloadUrls.add(downloadUrl);
        }
      });
    }
    return downloadUrls;
  }

我希望函数返回带有从Firebase检索到的下载URL的字符串列表,但它返回一个空列表。我该如何处理?

1 个答案:

答案 0 :(得分:1)

避免使用forEach。在这种情况下,您将创建闭包,每个闭包将在forEach循环之后完成。

相反,请使用常规的for循环,以便每个循环依次完成。

if (assets.isNotEmpty && !textOnly) {
  for (var asset in assets) {
    if (asset.runtimeType == Asset) {
      ByteData byteData = await asset.requestOriginal(quality: 85);
      List<int> assetData = byteData.buffer.asUint8List();
      StorageUploadTask uploadTask = storageRef
        .child('post_${Uuid().v4()}.jpg')
        .putData(assetData);
      StorageTaskSnapshot storageSnap = await uploadTask.onComplete;
      String downloadUrl = await storageSnap.ref.getDownloadURL();
      downloadUrls.add(downloadUrl);
    }
  }
}

如果您确实希望并行完成上传,请查看Future.wait,在这里您可以将其全部删除,然后等待所有期货完成。