#firebase #flutter #google-cloud-firestore #firebase-storage
# #firebase #flutter #google-облако-firestore #firebase-хранилище
Вопрос:
Я создаю программу, в которой при регистрации пользователя им необходимо загрузить изображение в хранилище firebase, а затем все данные для входа и URL-адрес изображения будут записаны в firestore, как только изображение будет загружено, это мой код :
void signUp(String _email, String _password, File image) async {
await _auth
.createUserWithEmailAndPassword(email: _email, password: _password)
.then((result) async{
await uploadImage(image).then((value) {
_firestore.collection('users').doc(result.user.uid).set({
'uid': result.user.uid,
'email': result.user.email,
'imageUrl' : value!=null?value:""
});
});
Future<String> uploadImage(File image) async{
String fileName = p.basename(image.path);
Reference storageRef = _fstorage.ref().child('upload/$fileName');
UploadTask uploadTask = storageRef.putFile(image);
await uploadTask.whenComplete((){
storageRef.getDownloadURL().then((imageUrl) {
return imageUrl!=null?imageUrl:"";
});
});
}
Проблема в том, что значение ImageUrl, записанное в документе firestore, всегда пустое, даже если файл изображения успешно загружен, любые советы будут оценены. Спасибо
Комментарии:
1. Вы пытались распечатать значения после загрузки? Возвращает ли он URL-адрес?
Ответ №1:
Функция uploadImage
фактически ничего не возвращает вызывающей стороне. Оператор return, который у вас есть сейчас, просто возвращает значение из анонимной функции, переданной whenComplete
. Оно не распространяется из функции верхнего уровня. Попробуйте распечатать значение value
, чтобы увидеть, что оно на самом деле содержит, прежде чем записывать его.
Похоже, вы хотите просто await
получить результаты обоих putFile
и getDownloadURL
последовательно получить URL-адрес, а затем вернуть его.
Future<String> uploadImage(File image) async{
String fileName = p.basename(image.path);
Reference storageRef = _fstorage.ref().child('upload/$fileName');
await storageRef.putFile(image);
return await storageRef.getDownloadURL()
}
Я также предлагаю ознакомиться с документацией.
Ответ №2:
Future<String> uploadItemImage(mFileImage) async {
final Reference storageReference =
FirebaseStorage.instance.ref().child("Items");
TaskSnapshot taskSnapshot = await
storageReference.child("product_$productId.jpg")
.putFile(mFileImage);
var downloadUrl = await taskSnapshot.ref.getDownloadURL();
return downloadUrl;
}