Firebase 存储 URL 是 FutureString
Firebase Storage URL is FutureString
在我的 flutter 应用中,用户图片是通过缓存网络图像命令加载的,该命令通过流构建器从 firestore 获取其 url。
我正在尝试通过按下图片来为用户添加更改他的图片的功能:
- 正在用图片选择器选择他的照片。
- 上传到 Firebase 存储。
- 正在使用新图像更新 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");
在我的 flutter 应用中,用户图片是通过缓存网络图像命令加载的,该命令通过流构建器从 firestore 获取其 url。
我正在尝试通过按下图片来为用户添加更改他的图片的功能:
- 正在用图片选择器选择他的照片。
- 上传到 Firebase 存储。
- 正在使用新图像更新 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");