我尝试上传一个图像到云firestore和firebase存储。我保存图像的网址在一个名为imgUrl
的变量中,这个变量稍后会传递到一个名为addIntervention()
的函数中。问题是上传任务需要很少的时间,所以如果我直接上传并点击保存按钮,imgUrl
将为空值,因为图像仍在上传。
下面是我的代码:
IconButton(
icon: Icon(
Icons.image,
color: Palette.primaryColor,
),
onPressed: () async {
ImagePicker imagePicker = ImagePicker();
XFile? file = await imagePicker.pickImage(
source: ImageSource.gallery);
if (file == null) return;
Reference referenceRoot =
FirebaseStorage.instance.ref();
Reference dirImages =
referenceRoot.child("iv_images");
Reference imgToUpload = dirImages.child(file.name);
try {
await imgToUpload.putFile(File(file.path));
var x = imgUrl = await imgToUpload.getDownloadURL();
imgUrl = x;
} catch (e) {}
},
),
对于按钮,我截取了以下片段:
if (imgUrl.isEmpty) {
QuickAlert.show(
context: context,
type: QuickAlertType.error,
title: 'Error',
text:
'Please upload an image');
} else {
await addIntervention(
imgUrl,
etatLabel,
numIntv,
intervention,
myPrice!,
note,
dateTime);
注意到我也在使用async/wait来保存按钮,有什么方法可以解决这个问题吗?
1条答案
按热度按时间rwqw0loc1#
您可以尝试以下提示:
1.第一件事,使你的上传时间少很多是压缩图片,你不必压缩图像,直到它变得模糊,但少量的压缩将大大减少你的上传时间。此外,如果用户选择了一个图像,然后他/她可能想裁剪它了。所以它会更好,如果你添加该功能了。
幸运的是,有一个名为
image_cropper
(link)的包,您可以使用它来裁剪和压缩图像。1.如果你不想显示任何负载指示器,那么你可以直接将图像传递到下一个屏幕,并在后台运行进程(这被称为乐观更新),但如果你想显示负载指示器,那么你可以使用package,它有很多种负载指示器,你会喜欢的。
1.当用户单击按钮时,您可以在按钮上显示进度指示器,以指示已上载的百分比,以及在用户单击按钮之前必须上载的百分比。
在firebase中,您可以获得如下百分比:
然后,您可以如下所示显示进度: