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