Флаттер, преобразующий сетевое изображение в байтовые данные

#flutter #dart

#флаттер #dart

Вопрос:

Есть ли лучший способ преобразовать сетевое изображение в байтовые данные? Я пытаюсь преобразовать сетевое изображение из URL-адреса firebase в байтовые данные, и вот мой код:

 Future<Uint8List> _loadNetworkImage() async {
    try {
      final response = await http.get(imageUrl);
      return response.bodyBytes;
    } catch (_) {
      throw "Couldn't resolve network Image.";
    }
  }
 

В настоящее время для преобразования фотографии размером 7 Мб требуется более 20 секунд.

Комментарии:

1. Нет, это правильный способ, требуется время, чтобы получить изображение из Интернета. Здесь могут возникнуть проблемы двух типов: 1. Ваше интернет-соединение медленное. 2. Конфигурация вашего сервера не настолько хороша, чтобы доставить изображение менее чем за 20 секунд для фотографии размером 7 МБ.

2. Я проверил оба сценария, прежде чем спрашивать. Сервер является хранилищем firebase, а скорость Интернета достаточно высока, загрузка обычно занимает около 2 максимум, загружая содержимое размером 10 МБ. Мне было бы все равно, если бы время составляло около 10 секунд, но 20 секунд — это слишком много времени ожидания.

3. Затем вы можете сделать это в фоновом режиме, потому что нет никакого способа уменьшить время, потому что оно зависит от размера вашего изображения.

4. вы решили это?

5. Да, вроде того. Пожалуйста, проверьте мой комментарий, чтобы увидеть решение, которое я реализовал. @RustamUsmanov

Ответ №1:

Вот как я закончил это делать.

 Future<Uint8List?> _loadNetworkImage(String path) async {
    final completer = Completer<ImageInfo>();
    var img = NetworkImage(path);
    img.resolve(const ImageConfiguration()).addListener(
        ImageStreamListener((info, _) => completer.complete(info)));
    final imageInfo = await completer.future;
    final byteData =
        await imageInfo.image.toByteData(format: ui.ImageByteFormat.png);
    return byteData?.buffer.asUint8List();
  }