我有一个函数,它接受 List<File>
并通过将文件上传到 Firebase 存储来返回 URL 列表(List<String>)
。
文件正在上传到存储,并且正在为单个上传生成 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;
}
第二个打印语句甚至没有打印到调试控制台。 有人可以帮我吗?
答案 0 :(得分:3)
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 上不起作用的原因是,该语句只是一个函数调用。对数组方法的函数调用。所以解释器调用它并移动到下一行,即打印和返回。所以此时,那些图片文件还没有上传。