Flutter загружает изображение в хранилище firebase, затем записывает его в firestore

#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;
}