Flutter Web: firebase_storage: MissingPluginException Aucune implémentation trouvée pour la méthode StorageReference # putData

Aug 27 2020

J'essaie de télécharger une image au format UInt8List sur le stockage Firebase. J'utilise "StorageReference.putData". Je reçois cette erreur en disant que putFile n'est pas défini. J'ai mis à jour tous les packages Firebase retardés et toujours pas de succès. PutData n'est-il pas possible sur Flutter Web?

J'ai essayé de mettre à jour tous les paquets, puis «flutter clean», «flutter packages get»

La raison pour laquelle je n'utilise pas "putFile" est que Flutter Web ne prend pas en charge dart: io qui contient la classe File spécifique requise pour utiliser putFile.

L'erreur:

Error: MissingPluginException(No implementation found for method StorageReference#putData on channel plugins.flutter.io/firebase_storage)
    at Object.throw_ [as throw] (http://localhost:60357/dart_sdk.js:4331:11)
    at MethodChannel._invokeMethod (http://localhost:60357/packages/flutter/src/services/system_channels.dart.lib.js:942:21)
    at _invokeMethod.next (<anonymous>)
    at http://localhost:60357/dart_sdk.js:37593:33
    at _RootZone.runUnary (http://localhost:60357/dart_sdk.js:37447:58)
    at _FutureListener.thenAwait.handleValue (http://localhost:60357/dart_sdk.js:32424:29)
    at handleValueCallback (http://localhost:60357/dart_sdk.js:32971:49)
    at Function._propagateToListeners (http://localhost:60357/dart_sdk.js:33009:17)
    at _Future.new.[_completeWithValue] (http://localhost:60357/dart_sdk.js:32852:23)
    at async._AsyncCallbackEntry.new.callback (http://localhost:60357/dart_sdk.js:32874:35)
    at Object._microtaskLoop (http://localhost:60357/dart_sdk.js:37708:13)
    at _startMicrotaskLoop (http://localhost:60357/dart_sdk.js:37714:13)
    at http://localhost:60357/dart_sdk.js:33226:9

Ma fonction de téléchargement:

  Future<StorageTaskSnapshot> uploadImage(Uint8List imageFile, int pos) {
    return storageRef
        .child("posts/${currentUser.uid}/$_postId/$pos.jpg")
        .putData(imageFile)
        .onComplete;
  }

Réponses

1 broken.eggshell Sep 04 2020 at 07:13

J'ai finalement réussi à faire fonctionner cela après avoir hybridé les réponses de plusieurs autres personnes. Je commence par une image de image_picker_for_web:

final picker = ImagePicker();
final new_image = await picker.getImage(
    source: source=='gallery' ? ImageSource.gallery : ImageSource.camera,
);

Ensuite:

String url;
var bytes = await new_image.readAsBytes();
try {
    fb.StorageReference _storage = fb.storage().ref('002test');
    fb.UploadTaskSnapshot uploadTaskSnapshot = await _storage.put(bytes, fb.UploadMetadata(contentType: 'image/png')).future;
    var imageUri = await uploadTaskSnapshot.ref.getDownloadURL();
    url = imageUri.toString();
} catch (e) {
    print(e);
}

C'est le SO qui m'a orienté dans la bonne direction: Flutter Web Upload vers Firestore