Saltar al contenido principal

Paint.enableDithering ahora es true por defecto.

Obsolescencia de `Paint.enableDithering` configurable por el usuario.

Resumen

#

Paint.enableDithering ahora es true por defecto (anteriormente, false), y está marcado como obsoleto en espera de su eliminación; Flutter ya no admite configuraciones de dithering (difuminado) configurables por el usuario.

Además, la documentación de dithering indica que el soporte es solo para gradientes.

Contexto

#

Paint.enableDithering se añadió como una opción global en el PR 13868 como respuesta al Issue 44134, que informaba que los gradientes en Flutter tenían artefactos de bandas visibles:

Los gradientes actualmente tienen muchas bandas de color en todos los dispositivos, y también se ve muy extraño al usar la animación de pulso. Una solución es hacer que los gradientes sean opacos y usar gradientes con dithering con Skia. Los gradientes con dithering no están expuestos actualmente, por lo que agregar un parámetro dither a la clase Paint de dart:ui sería agradable. Podríamos dibujar manualmente nuestros gradientes con un CustomPainter.

Ejemplo de banding (bandas de color)

El Issue 118073 reportó que los gradientes en nuestro nuevo motor de renderizado Impeller mostraban artefactos de bandas visibles en algunos gradientes. Más tarde se descubrió que Impeller no admitía la propiedad (rara vez utilizada) Paint.enableDithering.

Después de agregar soporte de dithering a Impeller (PR 44181, PR 44331, PR 44522) y revisar el impacto en el rendimiento del dithering (despreciable), se realizaron las siguientes observaciones:

  1. Consenso de que los gradientes se ven bien por defecto: Issue 112498.
  2. Tener una opción global estaba destinado a ser obsoleto: PR 13868.

Esto resultó en las siguientes decisiones:

  1. Hacer que el dithering esté activado por defecto.
  2. Marcar como obsoleta la opción global.
  3. Eliminar la opción global en una versión futura.

Como parte de ese proceso, la capacidad de que el dithering afecte a cualquier otra cosa que no sean gradientes se eliminó en el PR 44730 y el PR 44912. Esto se hizo para facilitar el proceso de migración, porque Impeller nunca admitirá el dithering para nada que no sean gradientes.

Guía de migración

#

La mayoría de los usuarios y librerías no necesitarán realizar ningún cambio.

Para los usuarios que mantienen pruebas visuales (golden tests), es posible que debas actualizar tus imágenes de referencia (goldens) para reflejar el nuevo valor predeterminado. Por ejemplo, si usas matchesGoldenFile para probar un widget que contiene un gradiente:

flutter test --update-goldens

Aunque no se espera que sea un caso común, puedes desactivar el dithering temporalmente estableciendo la propiedad enableDithering en tu método main() (ya sea en una aplicación o en una prueba):

dart
void main() {
  // TODO: Remove this after XYZ.
  Paint.enableDithering = false;

  runApp(MyApp());
}

Dado que el plan es eliminar permanentemente la propiedad enableDithering, por favor proporciona tus comentarios en el Issue 112498 si tienes un caso de uso que requiera desactivar el dithering (debido a rendimiento o caídas del sistema).

Si por alguna razón debes dibujar gradientes sin dithering, tendrás que escribir tu propio shader personalizado. Describir eso está fuera del alcance de esta guía de migración, pero puedes encontrar algunos recursos y ejemplos:

NOTA: Flutter web no admite dithering: Issue 134250.

Timeline

#

Introducido en la versión: 3.14.0-0.1.pre
En la versión estable: 3.16

Referencias

#

Documentación de la API:

Issues relevantes:

PRs relevantes: