概述

#

MaterialState 及其相关 API 已从 Material 库中移出,并重命名为 WidgetState

背景

#

之前,MaterialState 提供了处理 widget 可能拥有的多种不同状态(例如“悬停”、“聚焦”和“禁用”)的逻辑。由于此功能在 Material 库之外(特别是对于基础 Widgets 层和 Cupertino)也很有用,因此决定将其移出 Material 库。作为此次迁移的一部分,为了避免未来的混淆,不同的 MaterialState 类已重命名为 WidgetState。两者的行为相同。

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

MaterialStateOutlineInputBorderMaterialStateUnderlineInputBorder 类仍保留在 Material 库中,没有 WidgetState 等效项,因为它们是 Material Design 特有的。

迁移指南

#

提供了一个 Flutter 修复工具,可帮助将 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