Ich baue eine nachgebildete Social-Media-App, mit der Benutzer Profilbilder hochladen können, um ihre Profile zu erstellen. Ich baue diese App in Flut. Im Moment ist hier meine uploadPic-Methode:
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);
}
Ich habe in meiner Firebase-Konsole die richtigen Berechtigungen hinzugefügt, um das Lesen und Schreiben in die Datenbank zuzulassen. Ich weiß das, weil ich sehe, dass die Bilder erfolgreich hochgeladen wurden, wenn ich den Firebase-Speicher überprüfe. Wenn ich jedoch versuche, die zurückgegebene Foto-URL zu drucken (nach Abschluss der Upload-Aufgabe), erhalte ich einen Nullwert. Dies ist ein Problem, wenn ich versuche, in anderen Bereichen der App auf das Foto zuzugreifen, da die photoUrl des Benutzers in Firebase null ist.
Mache ich beim Hochladen des Bildes auf Firebase irgendetwas falsch? Außerdem gibt mein Terminal Folgendes zurück: Kein App-Check-Token für Anfrage.. Ich frage mich, ob das etwas mit dem Problem zu tun hat?
Jede Hilfe wäre sehr willkommen!
Lösung des Problems
Ihr Problem ist einfach, es ist genau von hier:
var photoUrl;
uploadTask.then((res) {
photoUrl = res.ref.getDownloadURL();
});
print(photoUrl); // null
Das Problem ist, dass Sie versuchen, eine photoUrl
Variable zu drucken, ohne darauf zu warten, dass die Zukunft uploadTask
ihre Arbeit beendet, was zu einem Ergebnis führt null
.
Die Lösung besteht darin, auf future zu warten, uploadTask
bevor die photoUrl
Variable gedruckt wird:
var photoUrl;
await uploadTask.then((res) async {
photoUrl = await res.ref.getDownloadURL();
});
print(photoUrl);
die Lösung für Ihren 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);
}
Keine Kommentare:
Kommentar veröffentlichen