摘要

#

Paint.enableDithering 現在預設為 true(先前為 false), 並且已被_棄用_,即將移除——Flutter 不再支援 使用者可自訂的抖動(dithering)設定。

此外,抖動相關文件現在明確指出,僅支援於漸層(gradients)。

背景

#

Paint.enableDithering 作為全域選項於 PR 13868 中新增, 以回應 Issue 44134,該議題回報 Flutter 中的漸層 會出現明顯的色帶(banding)問題:

目前漸層在所有裝置上都有嚴重的色帶現象,搭配 pulse 動畫時看起來很奇怪。 解決方法是讓漸層不透明,並在 Skia 中使用抖動漸層。 目前尚未開放抖動漸層的設定,因此若能在 dart:ui 的 Paint 類別中加入 dither 參數會很棒。 這樣我們就能用 CustomPainter 手動繪製漸層。

色帶範例

Issue 118073 回報我們新的 Impeller 後端在某些漸層上也出現明顯的色帶現象。 後來發現 Impeller 並不支援(很少被使用的) Paint.enableDithering 屬性。

在為 Impeller 加入抖動支援(PR 44181PR 44331PR 44522)並檢視抖動對效能的影響(幾乎可忽略)後, 有以下觀察:

  1. 社群共識認為預設的漸層效果已經很好:Issue 112498
  2. 原本就打算棄用全域選項:PR 13868

因此做出以下決策:

  1. 預設啟用抖動。
  2. 棄用全域選項。
  3. 未來版本將移除全域選項。

在這個過程中,PR 44730PR 44912 移除了抖動對漸層以外內容的影響。 這樣做是為了簡化遷移流程,因為 Impeller 永遠只會支援漸層的抖動,不會支援其他內容。

遷移指南

#

大多數使用者與函式庫不需要做任何更動。

若你有維護 golden tests(黃金測試), 可能需要更新 golden 圖片以符合新的預設值。 例如,若你使用 matchesGoldenFile 來測試包含漸層的元件(Widget):

flutter test --update-goldens

雖然這種情況預期並不常見,但你可以在 main() 方法中(無論是在應用程式或測試中)暫時停用抖動效果,只需設定 enableDithering 屬性即可:

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

  runApp(MyApp());
}

由於計畫要_永久_移除 enableDithering 屬性,如果你有因效能或閃退等需求,必須停用抖動(dithering),請在 Issue 112498 提供你的使用案例與回饋。

如果你有特殊需求,_必須_繪製無抖動的漸層(gradient),你將需要自行撰寫自訂著色器(custom shader)。本遷移指南不涵蓋相關說明,但你可以參考以下資源與範例:

注意:Flutter Web 不支援抖動(dithering):Issue 134250

時程

#

合併於版本:3.14.0-0.1.pre

穩定版釋出:3.16

參考資料

#

API 文件:

相關議題:

相關 PR: