概述

#

MaterialState 及其相關 API 已從 Material 庫移出,並重命名為 WidgetState

背景

#

以前,MaterialState 提供了處理小部件可能具有的多種不同狀態(如“懸停”、“聚焦”和“停用”)的邏輯。由於此功能在 Material 庫之外也很有用,尤其是在基礎 Widgets 層和 Cupertino 中,因此決定將其移出 Material。作為此舉的一部分,並避免將來混淆,不同的 MaterialState 類已被重新命名為 WidgetState。兩者行為相同。

之前現在
MaterialStateWidgetState
MaterialStatePropertyResolverWidgetStatePropertyResolver
MaterialStateColorWidgetStateColor
MaterialStateMouseCursorWidgetStateColorMouseCursor
MaterialStateBorderSideWidgetStateBorderSide
MaterialStateOutlinedBorderWidgetStateOutlinedBorder
MaterialStateTextStyleWidgetStateTextStyle
MaterialStatePropertyWidgetStateProperty
MaterialStatePropertyAllWidgetStatePropertyAll
MaterialStatesControllerWidgetStatesController

MaterialStateOutlineInputBorderMaterialStateUnderlineInputBorder 類保留在 Material 庫中,沒有 WidgetState 對應項,因為它們特定於 Material 設計。

遷移指南

#

提供了一個 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

參考資料

#

相關問題

相關 PR