我有一个异步功能,可以将文件上传到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的字符串列表,但它返回一个空列表。我该如何处理?
答案 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
,在这里您可以将其全部删除,然后等待所有期货完成。