Saltar al contenido principal

Grandes imágenes de ImageCache

Dejar de aumentar el maxByteSize de ImageCache para alojar imágenes grandes.

Resumen

#

El maxByteSize de ImageCache ya no se incrementa automáticamente para alojar imágenes grandes.

Contexto

#

Anteriormente, al cargar imágenes en el ImageCache que tenían un tamaño de bytes mayor que el maxByteSize de ImageCache, Flutter incrementaba de forma permanente el valor de maxByteSize para alojar esas imágenes. Esta lógica a veces conducía a valores de maxByteSize inflados que dificultaban el trabajo en sistemas con limitaciones de memoria.

Descripción del cambio

#

El siguiente pseudocódigo "antes" y "después" demuestra los cambios realizados en el algoritmo de ImageCache:

dart
// Old logic pseudocode
void onLoadImage(Image image) {
  if (image.byteSize > _cache.maxByteSize) {
    _cache.maxByteSize = image.byteSize + 1000;
  }
  _cache.add(image);
  while (_cache.count > _cache.maxCount
      || _cache.byteSize > _cache.maxByteSize) {
    _cache.discardOldestImage();
  }
}
dart
// New logic pseudocode
void onLoadImage(Image image) {
  if (image.byteSize < _cache.maxByteSize) {
    _cache.add(image);
    while (_cache.count > _cache.maxCount
        || _cache.byteSize > cache.maxByteSize) {
      cache.discardOldestImage();
    }
  }
}

Guía de migración

#

Podría haber situaciones en las que ImageCache experimente un exceso de intercambio (thrashing) con la nueva lógica que no ocurría anteriormente, específicamente si cargas imágenes que son más grandes que tu valor cache.maxByteSize. Esto se puede remediar mediante uno de los siguientes enfoques:

  1. Aumenta el valor de ImageCache.maxByteSize para alojar imágenes más grandes.
  2. Ajusta tu lógica de carga de imágenes para garantizar que las imágenes se adapten bien al valor de ImageCache.maxByteSize de tu elección.
  3. Crea una subclase de ImageCache, implementa la lógica deseada, y crea un nuevo binding que exponga tu subclase de ImageCache (consulta el código fuente de image_cache.dart).

Timeline

#

El algoritmo antiguo ya no es compatible.

Lanzado en la versión: 1.16.3
En versión estable: 1.17

Referencias

#

Documentación de la API:

Problema relevante:

PR relevante:

Otros: