GOOGLE ADS

среда, 27 апреля 2022 г.

Firebase возвращает null photoUrl

Я создаю фиктивное приложение для социальных сетей, которое позволяет пользователям загружать изображения профилей для создания своих профилей. Я создаю это приложение на флаттере. Прямо сейчас, вот мой метод uploadPic:

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

Я добавил правильные разрешения в свою консоль firebase, чтобы разрешить чтение и запись в базу данных. Я знаю это, потому что, когда я проверяю хранилище Firebase, я вижу, что изображения были успешно загружены. Однако, когда я пытаюсь распечатать возвращенный URL-адрес фотографии (после завершения задачи загрузки), я получаю нулевое значение. Это проблема, когда я пытаюсь получить доступ к фотографии в других областях приложения, потому что пользовательский photoUrl в firebase равен нулю.

Есть ли что-то, что я делаю неправильно в отношении загрузки изображения в firebase? Кроме того, мой терминал возвращает это: нет токена проверки приложения для запроса.. Интересно, это как-то связано с проблемой?

Любая помощь будет принята с благодарностью!


Решение проблемы

твоя проблема проста, она как раз отсюда:

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

проблема в том, что вы пытаетесь напечатать photoUrlпеременную, не дожидаясь, пока будущее uploadTaskзавершит свою работу, что приводит к null.

решение состоит в том, чтобы дождаться uploadTaskбудущего, прежде чем печатать photoUrlпеременную:

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

решение для вашего кода:

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

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...