Firebase 存储 URL 是 FutureString

Firebase Storage URL is FutureString

在我的 flutter 应用中,用户图片是通过缓存网络图像命令加载的,该命令通过流构建器从 firestore 获取其 url。

我正在尝试通过按下图片来为用户添加更改他的图片的功能:

  1. 正在用图片选择器选择他的照片。
  2. 上传到 Firebase 存储。
  3. 正在使用新图像更新 firestore usercollection 文档 url。

我创建了以下代码。 问题是 getDownloadURL() 没有返回实际的字符串,而是“'Future'”的实例。

因此存储在 firestore 中的新 link 不正确,无法供缓存网络图像使用。

如何获得实际的 URl 字符串?

我未来的功能代码:

Future ChangeProfilePic() async {
  String newimageurl = "";
  FirebaseStorage storage = FirebaseStorage.instance;
  Reference ref =
      storage.ref().child("ProfileImages/$globaluserid".toString());
  CollectionReference userscollectionref =
      FirebaseFirestore.instance.collection('UsersCollection');
  final ImagePicker _picker = ImagePicker();
  final XFile? image = await _picker.pickImage(source: ImageSource.gallery);
  File imagefile = File(image!.path);
  UploadTask uploadTask = ref.putFile(imagefile);
  uploadTask.whenComplete(() {
    newimageurl = ref.getDownloadURL().toString();
    print("Image Uploaded");
    userscollectionref
        .doc(globaluserid)
        .update({'User_image_link': newimageurl});
    print("Link is Updated");
  }).catchError((onError) {
    print("Error");
    print(onError);
  });
}

与代码中的许多调用一样,`` 是一个异步调用,其结果不会立即可用,因此 returns 一个 Future 将在某个时候包含该值。您可以使用 await 等待这样的 Future 完成并获取其值,类似于您在 await _picker.pickImage.

中所做的
await ref.getDownloadURL().toString();

另一个要考虑的变化是 putFile returns 一个 Task,但实际上也是一个 Future,这意味着你可以 await那也是。

结合这两个事实,您可以将代码简化为:

final XFile? image = await _picker.pickImage(source: ImageSource.gallery);
File imagefile = File(image!.path);
await ref.putFile(imagefile);
newimageurl = (await ref.getDownloadURL()).toString();
print("Image Uploaded");
userscollectionref
    .doc(globaluserid)
    .update({'User_image_link': newimageurl});
print("Link is Updated");