Saltar al contenido principal

Cambios en ImageCache e ImageProvider

ImageCache requiere que los implementadores sobrescriban containsKey, e ImageProvider ha marcado resolve como @nonVirtual.

Resumen

#

ImageCache ahora tiene un método llamado containsKey. Las subclases de ImageProvider no deberían sobrescribir resolve, sino que deberían implementar nuevos métodos en ImageProvider. Estos cambios fueron enviados en un único commit al framework.

Descripción del cambio

#

Las secciones a continuación describen los cambios en containsKey y ImageProvider.

Cambio en containsKey

#

Los clientes de ImageCache, como un ImageProvider personalizado, pueden querer saber si el caché ya está rastreando una imagen. Agregar el método containsKey permite a los llamadores descubrir esto sin llamar a un método como putIfAbsent, lo cual puede desencadenar una llamada no deseada a ImageProvider.load.

La implementación predeterminada verifica tanto los contenedores (buckets) de imágenes pendientes como los almacenados en caché.

dart
  bool containsKey(Object key) {
    return _pendingImages[key] != null || _cache[key] != null;
  }

Cambios en ImageProvider

#

El método ImageProvider.resolve realiza un trabajo complicado de manejo de errores que normalmente no debería sobrescribirse. Anteriormente también realizaba el trabajo de cargar la imagen en el caché de imágenes por medio de ImageProvider.obtainKey y ImageProvider.load. Las subclases no tenían oportunidad de sobrescribir este comportamiento sin sobrescribir resolve, y la capacidad de componer ImageProviders se ve limitada si múltiples ImageProviders esperan sobrescribir resolve.

Para resolver este problema, ahora resolve está marcado como non-virtual, y se han agregado dos nuevos métodos protegidos: createStream() y resolveStreamForKey(). Estos métodos permiten a las subclases controlar la mayor parte del comportamiento de resolve, sin tener que duplicar todo el trabajo de manejo de errores. También permite a las subclases que componen ImageProviders tener más confianza en que solo hay un punto de entrada público a los diversos proveedores encadenados.

Guía de migración

#

Cambio en ImageCache

#

Antes de la migración, el código no tendría una sobrescritura de containsKey.

Código después de la migración:

dart
class MyImageCache implements ImageCache {
  @override
  bool containsKey(Object key) {
    // Check if your custom cache is tracking this key.
  }

  ...
}

Cambio en ImageProvider

#

Código antes de la migración:

dart
class MyImageProvider extends ImageProvider<Object> {
  @override
  ImageStream resolve(ImageConfiguration configuration) {
    // create stream
    // set up error handling
    // interact with ImageCache
    // call obtainKey/load, etc.
  }
  ...
}

Código después de la migración:

dart
class MyImageProvider extends ImageProvider<Object> {
  @override
  ImageStream createStream(ImageConfiguration configuration) {
    // Return stream, or use super.createStream(),
    // which returns a new ImageStream.
  }

  @override
  void resolveStreamForKey(
    ImageConfiguration configuration,
    ImageStream stream,
    Object key,
    ImageErrorListener handleError,
  ) {
    // Interact with the cache, use the key, potentially call `load`,
    // and report any errors back through `handleError`.
  }
  ...
}

Timeline

#

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

Referencias

#

Documentación de la API:

Issues relevantes:

PRs relevantes: