概述

#

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