Предварительная загрузка (всех) графических ресурсов в приложении Flutter - PullRequest
0 голосов
/ 22 апреля 2020

Я бы хотел простой способ предварительно загрузить / кэшировать все мои статические 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>

Есть идеи, возможно ли это? Если нет Возможно - я упускаю что-то очевидное или это может быть (вероятное) будущее улучшение флаттера?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...