Flutter Web Загрузить в Firestore - PullRequest
0 голосов
/ 17 марта 2020

У меня проблемы с Flutter web и загрузкой изображений в Firestore. Я почти уверен, что проблема заключается в Средстве выбора изображений, так как обычное (мобильное) средство выбора изображений не работает для Интернета. Средство обычного выбора изображений возвращает файл, но альтернативный image_picker_web возвращает изображение, которое отклоняется при загрузке, поскольку оно ожидает Future<File>.

image_picker_web имеет альтернативу для возврата Uint8List, который я использовал, а затем преобразуется в File через dart:html - и загружает нормально, но изображение повреждено и не отображается

Вот что я сделал:

Нажатие кнопки - выбор изображения как Uint8List> Преобразование в Image, Сохранение в памяти и Отображение на экране

                  onPressed: () async {
                    //Upload Image as Uint8List
                    imageBytes = await ImagePickerWeb.getImage(asUint8List: true);
                    //Convert Uint8List to Image
                    _image = Image.memory(imageBytes);
                    //Show new image on screen
                    setBottomSheetState(() {
                      image = _image;
                    });
                  },

Преобразование Uint8List в File с использованием dart:html File и имя пользователя UID.png (PNG Uploaded)

 imageFile = html.File(imageBytes, '${user.uid}.png');

Использование метода для загрузки файла

import 'dart:async';
import 'package:firebase/firebase.dart' as fb;
import 'package:universal_html/prefer_universal/html.dart' as html;

String url;

  Future<String> uploadProfilePhoto(html.File image, {String imageName}) async {

    try {
      //Upload Profile Photo
      fb.StorageReference _storage = fb.storage().ref('profilephotos/$imageName.png');
      fb.UploadTaskSnapshot uploadTaskSnapshot = await _storage.put(image).future;
      // Wait until the file is uploaded then store the download url
      var imageUri = await uploadTaskSnapshot.ref.getDownloadURL();
      url = imageUri.toString();

    } catch (e) {
      print(e);
    }
    return url;
  }

Метод вызова

location = await uploadProfilePhoto(imageFile, imageName: '${user.uid}');

Добавление данных, включая местоположение, в базу данных Firebase

//Pass new user ID through to users Collection to link UserData to this user
await AdminUserData(uid: user.uid).updateAdminUserData(name: userName, email: userEmail, profilephoto: location);

Все работает хорошо, кажется, что изображение повреждено, оно также возвращает почти вдвое больший размер файла, что, очевидно, означает, что файл не возвращается как изображение ..

...