Я пытаюсь отобразить изображение по URL-адресу внутри NetworkImage в приложении Flutter, но возникает ошибка, из-за которой изображение не отображается. Вот зарегистрированное исключение:
D/HeifDecoderImpl(11496): No valid image or sequence available
E/FlutterJNI(11496): Failed to decode image
E/FlutterJNI(11496): android.graphics.ImageDecoder$DecodeException: Failed to create image decoder with message 'invalid input'Input contained an error.
E/FlutterJNI(11496): at android.graphics.ImageDecoder.nCreate(Native Method)
E/FlutterJNI(11496): at android.graphics.ImageDecoder.access$200(ImageDecoder.java:173)
E/FlutterJNI(11496): at android.graphics.ImageDecoder$ByteBufferSource.createImageDecoder(ImageDecoder.java:250)
E/FlutterJNI(11496): at android.graphics.ImageDecoder.decodeBitmapImpl(ImageDecoder.java:1862)
E/FlutterJNI(11496): at android.graphics.ImageDecoder.decodeBitmap(ImageDecoder.java:1855)
E/FlutterJNI(11496): at io.flutter.embedding.engine.FlutterJNI.decodeImage(FlutterJNI.java:559)
════════ Exception caught by image resource service ════════════════════════════
The following _Exception was thrown resolving an image codec:
Exception: Invalid image data
When the exception was thrown, this was the stack:
#0 _futurize (dart:ui/painting.dart:6966:5)
painting.dart:6966
#1 ImageDescriptor.encoded (dart:ui/painting.dart:6775:12)
painting.dart:6775
#2 instantiateImageCodecWithSize (dart:ui/painting.dart:2287:60)
painting.dart:2287
#3 PaintingBinding.instantiateImageCodecWithSize (package:flutter/src/painting/binding.dart:141:15)
binding.dart:141
#4 NetworkImage._loadAsync (package:flutter/src/painting/_network_image_io.dart:131:20)
_network_image_io.dart:131
<asynchronous suspension>
#5 MultiFrameImageStreamCompleter._handleCodecReady (package:flutter/src/painting/image_stream.dart:985:3)
image_stream.dart:985
<asynchronous suspension>
Image provider: NetworkImage("https://mega-store.s3.eu-west-2.amazonaws.com/shelly/0.2782753988222566.png", scale: 1.0)
Image key: NetworkImage("https://mega-store.s3.eu-west-2.amazonaws.com/shelly/0.2782753988222566.png", scale: 1.0)
════════════════════════════════════════════════════════════════════════════════
Вот URL изображения: https://mega-store.s3.eu-west-2.amazonaws.com/shelly/0.2782753988222566.png
Согласно моему тестированию, ошибка возникает только на устройствах Android 11. Я тестировал одно и то же изображение с тем же кодом на Android 12 и IOS 17.4, и все работает отлично.
Проблема в том, что изображение в URL-адресе сохраняется с расширением файла .png, но на самом деле его кодировка — это формат файла изображения AV1 (AVIF), и это очевидно, когда вы загружаете изображение по URL-адресу и проверяете кодировку файла по информации о файле. :
Причина, по которой изображение не работает на устройствах Android 11, заключается в том, что AV1 Формат файла поддерживается в Android только начиная с Android 12, вот фрагмент из официальной документации Android:
АВИФ
Android 12 (уровень API 31) и более поздние версии поддерживают изображения, использующие AV1. Формат файла изображения (AVIF). AVIF — это формат-контейнер для изображений и последовательности изображений, закодированные с использованием AV1. AVIF использует преимущества внутрикадровое кодирование контента в результате сжатия видео. Это резко улучшает качество изображения для файла того же размера по сравнению со старыми версиями форматы изображений, такие как JPEG. Для более детального ознакомления с преимуществами этот формат см. в блоге Джейка Арчибальда.
Следовательно, если вы продолжите тестирование на версиях Android ниже Android 11, это также не сработает.
PNG или JPEG, с которым нет проблем во всех версиях Android и IOS.AV1 изображений, но сначала вам придется проверить тип файла, чтобы узнать, действительно ли AV1 нужно использовать виджет, предоставленный пакетом, или нет, поскольку у вас могут быть другие изображения с другие форматы файлов.