Flutter Web: firebase_storage: MissingPluginException Реализация для метода StorageReference # putData не найдена.

Aug 27 2020

Я пытаюсь загрузить изображение в формате UInt8List в хранилище firebase. Я использую StorageReference.putData. Я продолжаю получать эту ошибку, говоря, что putFile не определен. Я обновил все запоздалые пакеты firebase и все еще безуспешно. Разве putData невозможно на Flutter Web?

Я попытался обновить все пакеты, а затем «flutter clean», «flutter packages get»

Причина, по которой я не использую "putFile", заключается в том, что Flutter Web не поддерживает dart: io, который содержит определенный класс File, необходимый для использования putFile.

Ошибка:

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

Моя функция загрузки:

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

Ответы

1 broken.eggshell Sep 04 2020 at 07:13

Я наконец заставил это работать после гибридизации ответов нескольких других людей. Я начинаю с изображения из image_picker_for_web:

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

Потом:

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

Это был SO, который указал мне правильное направление: Flutter Web Upload в Firestore