Почему возвращаемое значение из выбранного файла равно нулю? Флаттер - PullRequest
0 голосов
/ 10 июля 2020

В моем приложении я использую image_picker и image_picker_web, но он выдает исключение No podspec found for 'image_picker_web' in '.symlinks/plugins/image_picker_web/ios' при работе на iOS. Поэтому я решил не использовать его и выбрать файл, как в принятом здесь решении Как выбрать файлы и изображения для загрузки с помощью flutter web . Печать для выбранного файла верна, но мой метод возвращает значение null, я думаю, он возвращает переменную до того, как ей будет присвоено значение. Я не знаю html, так что я немного заблудился ... Что я делаю не так, возвращая выбранное значение?

FileReader reader = FileReader();
InputElement uploadInput = FileUploadInputElement();


Future<Uint8List> pickImage() async {
    print('FirebaseImageStorageRepositoryWeb. pickImage() started');
    // image_picker_web works on web but creates pod problems on iOS

//    Uint8List imageData;
//    String fileName;
//    await picker.getImage(source: ImageSource.gallery).then((picked) {
//      picked.readAsBytes().then((data) {
//        imageData = data;
//      });
//    });

    // image_picker // notworking on web...

    

    //html
    Uint8List imageData;
    InputElement uploadInput = FileUploadInputElement();
    uploadInput.click();

    uploadInput.onChange.listen((e)  {
      // read file content as dataURL
      final files = uploadInput.files;
      if (files.length == 1) {
        final file = files[0];

        print(
            'selected file: type:${file.type},name: ${file.name}, size: ${file.size}');

        reader.onLoadEnd.listen((e) {
          imageData = reader.result;
//          return imageData; // not working
        });

        reader.onError.listen((fileEvent) {
          print('Some Error occured while reading the file');
        });

        reader.readAsArrayBuffer(file);
      }
    });
    return imageData;
  }

1 Ответ

0 голосов
/ 11 июля 2020

После ответа на Image picker flutter web 1.9 (не принятый ..) Я мог видеть, что не так с приведенным выше кодом ..

работает:

@override
  Future<Uint8List> pickImage() async {
    print('FirebaseImageStorageRepositoryWeb.pickImage() started');
    final completer = Completer<Uint8List>();
    final InputElement input = document.createElement('input');
    input
      ..type = 'file'
      ..multiple = true
      ..accept = 'image/*';
    input.click();
    // onChange doesn't work on mobile safari
    input.addEventListener('change', (e) async {
      final List<File> files = input.files;
      Iterable<Future<Uint8List>> resultsFutures = files.map((file) {
        final reader = FileReader();
        reader.readAsArrayBuffer(files.first); // .readAsDataUrl(file);
        reader.onError.listen((error) => completer.completeError(error));
        return reader.onLoad.first.then((_) => reader.result);
      });

      final results = await Future.wait(resultsFutures);
      completer.complete(results.first);
    });
    // need to append on mobile safari
    document.body.append(input);
    // input.click(); can be here
    final Uint8List image = await completer.future;
    input.remove();
    return image;
  }
...