概述

#

Paint.enableDithering 现在默认值为 true(之前为 false),并且正在被弃用,等待移除——Flutter 不再支持用户可配置的抖动设置。

此外,抖动文档指出支持用于渐变。

背景

#

Paint.enableDitheringPR 13868 中被添加为全局选项,以响应 Issue 44134,该问题报告称 Flutter 中的渐变存在可见的色带伪影。

目前,所有设备上的渐变都存在严重的色带问题,在使用脉冲动画时也会显得非常奇怪。解决方案是将渐变设置为不透明,并使用 Skia 的抖动渐变。目前尚未公开抖动渐变,因此在 dart:ui 的 Paint 类中添加一个抖动参数将非常方便。我们可以通过 CustomPainter 手动绘制渐变。

Example of banding

Issue 118073 报告称,我们新的 Impeller 后端中的渐变在某些渐变中显示了可见的色带伪影。后来发现 Impeller 不支持(很少使用的) Paint.enableDithering 属性。

在为 Impeller 添加抖动支持(PR 44181PR 44331PR 44522)并审查了抖动的性能影响(可忽略不计)后,得出了以下观察结果:

  1. 大家一致认为渐变默认看起来效果很好:Issue 112498
  2. 全局选项的意图是将其弃用:PR 13868

这导致了以下决定:

  1. 默认启用抖动。
  2. 弃用全局选项。
  3. 在未来版本中移除全局选项。

在此过程中,在 PR 44730PR 44912 中移除了抖动影响渐变以外任何内容的功能。这样做是为了简化迁移过程,因为 Impeller 永远不会支持除渐变以外的其他任何内容的抖动。

迁移指南

#

大多数用户和库将不需要进行任何更改。

对于维护黄金测试的用户,您可能需要更新您的黄金图像以反映新的默认设置。例如,如果您使用 matchesGoldenFile 来测试包含渐变的 widget

flutter test --update-goldens

虽然这种情况不应常见,但您可以通过在 main() 方法中(无论是应用程序还是测试)设置 enableDithering 属性来暂时禁用抖动。

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

  runApp(MyApp());
}

由于计划是永久移除 enableDithering 属性,如果您有需要禁用抖动的用例(由于性能、崩溃原因),请在 Issue 112498 中提供反馈。

如果出于某种原因您必须在没有抖动的情况下绘制渐变,您需要编写自己的自定义着色器。这超出了本迁移指南的范围,但您可以找到一些资源和示例:

注意:Flutter Web 不支持抖动:Issue 134250

时间线

#

已于版本:3.14.0-0.1.pre 登陆
稳定版本:3.16

参考资料

#

API 文档

相关问题

相关 PR