概述

#

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

此外,抖动文档声明仅支持渐变。

背景

#

Paint.enableDithering 作为全局选项在 PR 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