Я бы хотел простой способ предварительно загрузить / кэшировать все мои статические c графические ресурсы, чтобы они могли быть обработаны / обработаны без задержки.
Я видел, что есть precacheImage()
вызов, который можно использовать для предварительной загрузки / кэширования AssetImage. Для этого нужен контекст, и рекомендуется вызывать его в переопределении didChangeDependencies()
.
Разве не должно быть способа сделать это проще и более общим? Мое приложение использует в общей сложности 1,5 МБ данных изображений (и я включил версии с увеличенной версией 2.0x и 3.0x в это число). Изображения PNG размером 50 КБ (и не масштабированные версии) занимают заметное количество времени для отображения, возможно, 300-600 мс как на эмуляторе, так и на быстрых устройствах. Это локальные ресурсы, которые не передаются по сети. Я нахожу это раздражающим, и я разочарован тем, что нет лучшего способа справиться с этим?
Я также видел совет по использованию FadeInImage
, но опять же - это не совсем то, что я ищу for.
Я отображаю изображение в виджете без состояния (пользовательская кнопка). Невозможно использовать precacheImage в виджете без состояния afaik. Поэтому мне нужно встроить Image.asset () в родительский виджет, вызвать precacheImage, а затем передать виджет изображения моему виджету без сохранения состояния и отобразить его в сборке - это громоздко.
Кроме того, изображения будут отображаться в разных местах (разные родительские виджеты). Иногда виджеты изображений различаются по размеру между виджетами, и поскольку размер равен Image.asset()
, я думаю, мне нужно будет предварительно кэшировать каждый уникальный размер и передавать эти предварительно кэшированные виджеты изображений. Разве нельзя сказать Flutter «кэшировать» данные PNG так, чтобы при запросе Image.asset он считывал PNG из кэша - без необходимости обходить предварительно кэшированные виджеты изображений?
Я бы как "precacheAllImageAssets () call or call
precacheImage ()` со строкой, так что каждый Image.asset (), который ссылается на тот же ресурс, будет кэширован.
Я предполагаю, что Flutter внутренне кэширует виджет изображения (включая это размер и другие свойства) как некоторый внутренний объект рендеринга, который кэшируется. Таким образом, предварительное кэширование двух разных размеров одного и того же изображения потребует двух разных кэшей. С учетом сказанного - я все еще хотел бы вызов precacheAllImageAssets()
, который мог бы в меньше всего считывать данные PNG в память и просто обслуживать их быстрее, даже если потребуется выполнить некоторую обработку, чтобы получить данные PNG для фактического виджета с размером до того, как он может быть визуализирован. С таким кэшем я мог бы получить задержку рендеринга <50 мс вместо текущих 300-600 мс. </p>
Есть идеи, возможно ли это? Если нет Возможно - я упускаю что-то очевидное или это может быть (вероятное) будущее улучшение флаттера?