Я делаю программу, в которой при регистрации пользователя им необходимо загрузить изображение в хранилище 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
Функция
uploadImage
на самом деле ничего не возвращает вызывающему. Оператор return, который у вас есть, просто возвращает значение из анонимной функции, переданной вwhenComplete
. Он не распространяется из функции верхнего уровня. Попробуйте распечатать значениеvalue
, чтобы увидеть, что оно фактически содержит, прежде чем записывать его.Похоже, вы хотите просто
await
последовательно получитьawait
результаты какputFile
, так иgetDownloadURL
, чтобы получить URL-адрес, а затем вернуть его.Я также предлагаю ознакомиться с документацией.
Спасибо, это сработало — person Jolzal; 09.12.2020