web-dev-qa-db-fra.com

Comment télécharger une image sur Firebase à l'aide de Flutter

J'utilise la bibliothèque image_picker https://pub.dartlang.org/packages/image_picker avec pour sélectionner/prendre la photo que je souhaite télécharger. Jusqu'à présent, le code télécharge correctement l'image sur le stockage Firebase, le seul problème est qu'après le téléchargement de l'image, l'application s'arrête (ne se bloque pas vraiment, elle se ferme simplement et le code VS perd la connexion à l'appareil). Le code est le suivant:

 File _image;

  Future _takeProfilePicture() async{
    var image = await ImagePicker.pickImage(source: ImageSource.camera);

    setState((){
      _image = image;
    });
  }

  Future _selectProfilePicture() async{
    var image = await ImagePicker.pickImage(source: ImageSource.gallery);

    setState((){
      _image = image;
    });
  }

  Future<Null> _uploadProfilePicture() async{
    FirebaseUser user = await FirebaseAuth.instance.currentUser();

    final StorageReference ref = FirebaseStorage.instance.ref().child('${user.email}/${user.email}_profilePicture.jpg');
    final StorageUploadTask uploadTask = ref.putFile(_image);
    final Uri downloadUrl = (await uploadTask.future).downloadUrl;
  }

  void _selectAndUploadPicture() async{
    await _selectProfilePicture();
    await _uploadProfilePicture();
  }

  void _takeAndUploadPicture() async{
    await _takeProfilePicture();
    await _uploadProfilePicture();
  }

Et le terminal imprime ce qui suit:

W/Firestore( 6873): (0.6.6-dev) [Firestore]: The behavior for Java.util.Date objects stored in Firestore is going to change AND YOUR APP MAY BREAK.
W/Firestore( 6873): To hide this warning and ensure your app does not break, you need to add the following code to your app before calling any other Cloud Firestore methods:
W/Firestore( 6873):
W/Firestore( 6873): FirebaseFirestore firestore = FirebaseFirestore.getInstance();
W/Firestore( 6873): FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
W/Firestore( 6873):     .setTimestampsInSnapshotsEnabled(true)
W/Firestore( 6873):     .build();
W/Firestore( 6873): firestore.setFirestoreSettings(settings);
W/Firestore( 6873):
W/Firestore( 6873): With this change, timestamps stored in Cloud Firestore will be read back as com.google.firebase.Timestamp objects instead of as system Java.util.Date objects. So you will also need to update code expecting a Java.util.Date to instead expect a Timestamp. For example:
W/Firestore( 6873):
W/Firestore( 6873): // Old:
W/Firestore( 6873): Java.util.Date date = snapshot.getDate("created_at");
W/Firestore( 6873): // New:
W/Firestore( 6873): Timestamp timestamp = snapshot.getTimestamp("created_at");
W/Firestore( 6873): Java.util.Date date = timestamp.toDate();
W/Firestore( 6873):
W/Firestore( 6873): Please audit all existing usages of Java.util.Date when you enable the new behavior. In a future release, the behavior will be changed to the new behavior, so if you do not follow these steps, YOUR APP MAY BREAK.

J'ai essayé d'implémenter le code Java Java du terminal, mais je n'arrive pas à trouver un moyen d'écrire l'équivalent en flutter en utilisant la bibliothèque cloud_firestore https://pub.dartlang.org/packages/cloud_firestore , il n'a pas d'équivalent pour FirebaseFirestoreSettings (ou je n'arrive pas à en trouver un). Y a-t-il un moyen de contourner cela?

Merci d'avance!

8
Marko

Version mise à jour de la réponse de mmccabe qui fonctionne avec la version 1.0.4 du plugin firebase_storage

Future<String> _pickSaveImage(String imageId) async {
  File imageFile = await ImagePicker.pickImage(source: ImageSource.camera);
  StorageReference ref =
    FirebaseStorage.instance.ref().child(imageId).child("image.jpg");
  StorageUploadTask uploadTask = ref.putFile(imageFile);
  return await (await uploadTask.onComplete).ref.getDownloadURL();
}

À partir de maintenant, vous devez faire:

var downloadURL = (attendez uploadTask.onComplete) .ref.getDownloadURL ();

car erreur: le getter 'future' n'est pas défini pour la classe 'StorageUploadTask'. (undefined_getter at [minutracker] lib/screens/image_detection.Dart: 63)

8
Mans

Ce qui suit fonctionne pour moi:

Future<Uri> _pickSaveImage(String imageId) async {
  File imageFile = await ImagePicker.pickImage(source: ImageSource.camera);
  StorageReference ref =
    FirebaseStorage.instance.ref().child(imageId).child("image.jpg");
  StorageUploadTask uploadTask = ref.putFile(imageFile);
  return (await uploadTask.future).downloadUrl;
}
2
mmccabe
Future<String> _pickSaveImage(String imageId) async {
  File imageFile = await ImagePicker.pickImage(source: ImageSource.camera);
  StorageReference ref =
    FirebaseStorage.instance.ref().child(imageId).child("image.jpg");
  StorageUploadTask uploadTask = ref.putFile(imageFile);
  return await (await uploadTask.onComplete).ref.getDownloadURL();
}

À partir de maintenant,

Cela donne une erreur:

retourner attendre (attendre uploadTask.onComplete) .ref.getDownloadURL ();

Cela ne signifie pas:

return (attendez uploadTask.onComplete) .ref.getDownloadURL ();

Message d'erreur:

The getter 'future' isn't defined for the class 'StorageUploadTask'. 

undefined_getter at [timetracker] lib/screens/image_detection.Dart:63)

0