在 firebase 上上传图片的正确顺序

Correct order to upload images on firebase

要为用户创建的对象上传图像,我将图像(由用户选择)作为文件存储在数组 'imagesList' 中。当用户点击上传(整个对象)时,以下方法将数据保存在 firebase 上:

TextButton(
     onPressed: () async {
        await uploadImage();
        await jobService.createJob(Job(
            titleTextEditorController.text.trim(),
            category,
            false,
            false,
            finalImageList));
        },
       child: Text('upload')),

第一个方法'uploadImage()'中填充List finalImageList。我用另一种方法获取它来获取 await 语句。代码:

uploadImage() async {
  for (int i = 0; i < imageList.length; i++) {
    _imageFile = imageList[i];

    String fileName = Path.basename(_imageFile!.path);

    Reference reference =
        FirebaseStorage.instance.ref().child('uploads/$fileName');

    firebase_storage.SettableMetadata(
        contentType: 'image/jpeg',
        customMetadata: {'picked-file-path': fileName});

    UploadTask uploadTask = reference.putFile(_imageFile!);
    uploadTask.whenComplete(() async {
      try {
        imageUrl = await reference.getDownloadURL();
        print('imageUrl' + imageUrl);
        finalImageList.add(imageUrl);
      } catch (onError) {
        print("Upload Error");
      }
    });
    await Future.value(uploadTask)
        .then((value) => {print('Upload file path ${value.ref.fullPath}')})
        .onError((error, stackTrace) =>
            {print('Upload file path error ${error.toString()}')});
  }
}

但是该方法速度不够快,无法将 imageUrl 存储在 finalImageList 中,因此图像在线但未连接到 firebase 中的对象。是否有可能立即上传或正确保存 imageUrl?还是我的代码顺序错误?

FlutterFire UploadTask class 扩展了 Future,这意味着您可以在其上使用 await 等待上传完成。

这意味着您可以编写更简单的代码:

await reference.putFile(_imageFile!);
imageUrl = await reference.getDownloadURL();
finalImageList.add(imageUrl);
print('Upload file path ${value.ref.fullPath}')

进行此更改后,您的 uploadImage 将仅在 下载 URL 添加到 finalImageList 完成。