flutter firebase图像上传需要时间来获取文件url

eqqqjvef  于 2023-01-27  发布在  Flutter
关注(0)|答案(1)|浏览(145)

我尝试上传一个图像到云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来保存按钮,有什么方法可以解决这个问题吗?

rwqw0loc

rwqw0loc1#

您可以尝试以下提示:
1.第一件事,使你的上传时间少很多是压缩图片,你不必压缩图像,直到它变得模糊,但少量的压缩将大大减少你的上传时间。此外,如果用户选择了一个图像,然后他/她可能想裁剪它了。所以它会更好,如果你添加该功能了。
幸运的是,有一个名为image_cropperlink)的包,您可以使用它来裁剪和压缩图像。
1.如果你不想显示任何负载指示器,那么你可以直接将图像传递到下一个屏幕,并在后台运行进程(这被称为乐观更新),但如果你想显示负载指示器,那么你可以使用package,它有很多种负载指示器,你会喜欢的。
1.当用户单击按钮时,您可以在按钮上显示进度指示器,以指示已上载的百分比,以及在用户单击按钮之前必须上载的百分比。
在firebase中,您可以获得如下百分比:

Future getImage(BuildContext context) async {
    final picker = ImagePicker();
    final pickedFile = await picker.getImage(source: ImageSource.gallery);
    setState(() {
      _image = File(pickedFile.path);
    });
    StorageReference firebaseStorageRef = FirebaseStorage.instance.ref().child('profile/${Path.basename(_image.path)}}');
    StorageUploadTask uploadTask = firebaseStorageRef.putFile(_image);
    var dowurl = await (await uploadTask.onComplete).ref.getDownloadURL();   
     setState(() {    
       _imageURL = dowurl.toString();

     });

    print(_imageURL);
  } 

uploadTask.events.listen((event) {
      setState(() {
        _progress = event.snapshot.bytesTransferred.toDouble() /
            event.snapshot.totalByteCount.toDouble();
      });
    }).onError((error) {
      // do something to handle error
    });

然后,您可以如下所示显示进度:

Text('Uploading ${(_progress * 100).toStringAsFixed(2)} %')

相关问题