Skip to main content

將 MaterialState 重新命名為 WidgetState

MaterialState 及其相關 API 已移出 Material 函式庫, 並重新命名為 WidgetState。

摘要

#

MaterialState 及其相關 API 已從 Material 函式庫中移除, 並重新命名為 WidgetState

背景

#

過去,MaterialState 提供了處理元件(Widget)可擁有的多種不同狀態的邏輯, 例如「滑鼠懸停(hovered)」、「獲得焦點(focused)」以及「已停用(disabled)」等。 由於這項功能在 Material 函式庫之外也很有用, 特別是在基礎 Widgets 層和 Cupertino, 因此決定將其移出 Material 函式庫。 作為這次調整的一部分,並為了避免未來產生混淆, 不同的 MaterialState 類別已重新命名為 WidgetState。 兩者的行為完全相同。

調整前調整後
MaterialStateWidgetState
MaterialStatePropertyResolverWidgetStatePropertyResolver
MaterialStateColorWidgetStateColor
MaterialStateMouseCursorWidgetStateColorMouseCursor
MaterialStateBorderSideWidgetStateBorderSide
MaterialStateOutlinedBorderWidgetStateOutlinedBorder
MaterialStateTextStyleWidgetStateTextStyle
MaterialStatePropertyWidgetStateProperty
MaterialStatePropertyAllWidgetStatePropertyAll
MaterialStatesControllerWidgetStatesController

MaterialStateOutlineInputBorderMaterialStateUnderlineInputBorder 這兩個類別仍保留在 Material 函式庫中, 且沒有對應的 WidgetState,因為它們是 Material Design 專屬的。

遷移指南

#

提供了一個 Flutter fix,可協助將 MaterialState 類別遷移至 WidgetState

若要遷移,請將 MaterialState 替換為 WidgetState

遷移前的程式碼:

dart
MaterialState selected = MaterialState.selected;

final MaterialStateProperty<Color> backgroundColor;

class _MouseCursor extends MaterialStateMouseCursor{
  const _MouseCursor(this.resolveCallback);

  final MaterialPropertyResolver<MouseCursor?> resolveCallback;

  @override
  MouseCursor resolve(Set<MaterialState> states) => resolveCallback(states) ?? MouseCursor.uncontrolled;
}

BorderSide side = MaterialStateBorderSide.resolveWith((Set<MaterialState> states) {
  if (states.contains(MaterialState.selected)) {
    return const BorderSide(color: Colors.red);
  }
  return null;
});

遷移後的程式碼:

dart
WidgetState selected = WidgetState.selected;

final WidgetStateProperty<Color> backgroundColor;

class _MouseCursor extends WidgetStateMouseCursor{
  const _MouseCursor(this.resolveCallback);

  final WidgetPropertyResolver<MouseCursor?> resolveCallback;

  @override
  MouseCursor resolve(Set<WidgetState> states) => resolveCallback(states) ?? MouseCursor.uncontrolled;
}

BorderSide side = WidgetStateBorderSide.resolveWith((Set<WidgetState> states) {
  if (states.contains(WidgetState.selected)) {
    return const BorderSide(color: Colors.red);
  }
  return null;
});

時程

#

合併於版本:3.21.0-11.0.pre
進入穩定版:3.22.0

參考資料

#

相關議題(issues):

相關 PR: