Flutter 颤振:处理异步操作

Flutter 颤振:处理异步操作,flutter,dart,Flutter,Dart,我有一个将文件上传到firebase存储的异步函数。我试图通过字符串列表返回为每个文件检索的下载url。但是,我遇到的问题是,函数在异步操作完成之前执行return行 我的代码如下所示: Future uploadAssets()异步{ List downloadURL=List(); if(assets.isNotEmpty&&!textOnly){ forEach((资产)异步{ if(asset.runtimeType==资产){ ByteData ByteData=等待资产。请求原件(质

我有一个将文件上传到firebase存储的异步函数。我试图通过字符串列表返回为每个文件检索的下载url。但是,我遇到的问题是,函数在异步操作完成之前执行
return

我的代码如下所示:

Future uploadAssets()异步{
List downloadURL=List();
if(assets.isNotEmpty&&!textOnly){
forEach((资产)异步{
if(asset.runtimeType==资产){
ByteData ByteData=等待资产。请求原件(质量:85);
List assetData=byteData.buffer.asUint8List();
StorageUploadTask uploadTask=storageRef
.child('post_uid().v4()}.jpg')
.putData(资产数据);
StorageTaskSnapshot storageSnap=等待上载Task.onComplete;
String downloadUrl=await-storageSnap.ref.getDownloadURL();
downloadUrl.add(downloadUrl);
}
});
}
返回下载的URL;
}

我希望函数返回一个字符串列表,其中包含从firebase检索到的下载URL,但它返回一个空列表。如何处理此问题?

避免使用
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);
    }
  }
}
if(assets.isNotEmpty&&!textOnly){
对于(资产中的var资产){
if(asset.runtimeType==资产){
ByteData ByteData=等待资产。请求原件(质量:85);
List assetData=byteData.buffer.asUint8List();
StorageUploadTask uploadTask=storageRef
.child('post_uid().v4()}.jpg')
.putData(资产数据);
StorageTaskSnapshot storageSnap=等待上载Task.onComplete;
String downloadUrl=await-storageSnap.ref.getDownloadURL();
downloadUrl.add(downloadUrl);
}
}
}

如果你真的想让上传同时完成,那么看看
未来。等待
你可以将它们全部启动,然后等待所有的未来完成。

看起来你调用的函数之一没有达到你期望的效果。谢谢兄弟的解释。关于
的未来。等等,你能举个例子吗。如果没有,则没有问题,for
循环的
就足够了。我只是想试试看哪一个性能更好。我会研究它,看看我是否能够运用它的研究“dartlang等待不止一个未来”来寻找现有的最佳答案。