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

Я делаю программу, в которой при регистрации пользователя им необходимо загрузить изображение в хранилище 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, всегда пусто, даже если файл изображения успешно загружен, любые советы будут приняты во внимание. Благодарность

Вы пытались распечатать значения после загрузки? Возвращает ли он URL?   —  person Jolzal    schedule 08.12.2020

См. также:  Flutter / Dart получает изображение / данные из API на основе токена входа пользователя
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Jolzal

    Функция uploadImage на самом деле ничего не возвращает вызывающему. Оператор return, который у вас есть, просто возвращает значение из анонимной функции, переданной в whenComplete. Он не распространяется из функции верхнего уровня. Попробуйте распечатать значение value, чтобы увидеть, что оно фактически содержит, прежде чем записывать его.

    Похоже, вы хотите просто await последовательно получить 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()
      }
    

    Я также предлагаю ознакомиться с документацией.

    Спасибо, это сработало person Jolzal; 09.12.2020

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: