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