I would like to use Flutter to upload the image to Firebase's FireStorage and save the image URL to Forest.
We upload images of Firestorage through asynchronous processing.
However, during the upload, the Firestore is saved and the image URL is not saved.
pubspec.yaml
Future<void>saveData(
String title, String address, String description) async {
/// ↑ Retrieve the form information entered as an argument
String_userimageurl,_displayname,_username,_uid;
_uid = FirebaseAuth.instance.currentUser.uid;
// Get user information from DB
var result=wait FirebaseFirestore.instance
.collection('users')
.where("uid", isEqualTo:_uid)
.get();
_userimageurl=result.docs[0].get("imageurl");
_displayname=result.docs[0].get("displayname");
_username=result.docs[0].get("username");
// Image upload, URL acquisition
value = wait this.saveImage(this.images);
// Save Firestore
waitFirebaseFirestore.instance.collection('posts').add({
'title': title,
'address': address,
'description': description,
'star' —This.star_cnt,
"category"—this.category,
"images": value,
"user_id":_uid,
"username":_username,
"user_displayname":_displayname,
"user_imageurl":_userimageurl,
'created': new DateTime.now(),
});
notifyListeners();
}
Future<List<String>>saveImage(List<Asset>images)async{
List<String>images_arr=[];
wait images.forEach(element)async {
String unixtimestamp=
DateTime.now().toUtc().millisecondsSinceEpoch.toString();
ByteData byteData=wait element.getByteData();
List<int>imageData=byteData.buffer.asUint8List();
StorageReference ref=FirebaseStorage.instance
.ref()
.child("images")
.child("${unixtimestamp}.jpeg");
StorageUploadTask UploadTask=ref.putData(
imageData,
StorageMetadata(
contentType: "image/jpeg",
));
varurl = wait (wait uploadTask.onComplete).ref.getDownloadURL();
images_arr.add(url);
});
return images_arr;
}
Note: multi_image_picker FireStore Sample Code
Uploading images, obtaining download URLs, and saving DBs are already done.
All you can do is wait until you get the URL of the image and save the DB.
I think Future and wait are wrong, but I asked because it didn't solve the problem after reading the online article.
Thank you for your cooperation.
Future.forEach seems to solve this problem.
wait images.forEach(element)async{
↓
waitFuture.forEach(images, (element)async{
https://stackoverflow.com/questions/42467663/async-await-in-list-foreach
© 2024 OneMinuteCode. All rights reserved.