Home > OS >  Firebase returns null photoUrl
Firebase returns null photoUrl

Time:04-13

I am building a mock social media app that allows users upload profile pictures to create their profiles. I am building this app in flutter. Right now, here's my uploadPic method:

Future uploadPic(BuildContext context) async{

    String fileName = basename(_image.path);
    FirebaseStorage storage = FirebaseStorage.instance;
    var photoUrl;

    Reference ref = storage.ref().child(fileName);
    var storedImage = File(_image.path);
    UploadTask uploadTask = ref.putFile(storedImage);
    uploadTask.then((res) {
      photoUrl = res.ref.getDownloadURL();
    });


    print("photo url -- $photoUrl");
    await widget.user?.updatePhotoURL(photoUrl);
    await FirebaseAuth.instance.currentUser?.updatePhotoURL(photoUrl);
  }

I have added the right permissions in my firebase console to allow read and write to the database. I know this because when I check firebase storage, I see the pictures have been uploaded successfully. However, when I try to print the returned photo url (after the upload task completes), I get a null value. This is a problem when I try to access the photo in other areas in the app, because the user photoUrl in firebase is null.

Is there anything I am doing wrong concerning the upload of the pic to firebase? Also, my terminal returns this: No App Check token for request.. I'm wondering if this has anything to do with the issue?

Any help would be greatly appreciated!

CodePudding user response:

your problem is simple, it's exactly from here:

var photoUrl;
uploadTask.then((res) {
   photoUrl = res.ref.getDownloadURL();
});
print(photoUrl); // null

the problem is you are trying to print photoUrl variable without waiting for the future uploadTask to finish its work which results null.

the solution is to wait for uploadTask future before printing the photoUrl variable:

var photoUrl;
await uploadTask.then((res) async {
   photoUrl = await res.ref.getDownloadURL();
});
print(photoUrl);

the solution on your code:

Future uploadPic(BuildContext context) async{

    String fileName = basename(_image.path);
    FirebaseStorage storage = FirebaseStorage.instance;
    var photoUrl;

    Reference ref = storage.ref().child(fileName);
    var storedImage = File(_image.path);
    UploadTask uploadTask = ref.putFile(storedImage);
    await uploadTask.then((res) async {
       photoUrl = await res.ref.getDownloadURL();
    });


    print("photo url -- $photoUrl");
    await widget.user?.updatePhotoURL(photoUrl);
    await FirebaseAuth.instance.currentUser?.updatePhotoURL(photoUrl);
  }
  • Related