Flutter Web: firebase_storage: MissingPluginException No se encontró implementación para el método StorageReference # putData

Aug 27 2020

Estoy intentando cargar una imagen en formato UInt8List al almacenamiento de base de fuego. Estoy usando "StorageReference.putData". Sigo recibiendo este error que dice que putFile no está definido. He actualizado a todos los paquetes de base de fuego recientes y todavía no he tenido éxito. ¿PutData no es posible en Flutter Web?

He intentado actualizar todos los paquetes y luego 'flutter clean', 'flutter packages get'

La razón por la que no estoy usando "putFile" es porque Flutter Web no es compatible con dart: io, que contiene la clase de archivo específica necesaria para usar putFile.

El error:

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

Mi función de carga:

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

Respuestas

1 broken.eggshell Sep 04 2020 at 07:13

Finalmente conseguí que esto funcionara después de hibridar las respuestas de varias personas. Empiezo con una imagen de image_picker_for_web:

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

Luego:

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);
}

Este fue el SO que me indicó la dirección correcta: Flutter Web Upload to Firestore