概述

#

根据 Flutter 的弃用策略,在 2.10 稳定版发布后达到生命周期末尾的弃用 API 已被移除。

所有受影响的 API 已编译到此主要来源中,以帮助迁移。还提供了快速参考表

变更

#

本节按受影响的类列出了弃用项。


#

Flutter Fix 支持:是

`maxLengthEnforced` 在 v1.25 中被弃用。

请改用 `maxLengthEnforcement`。当 `maxLengthEnforced` 为 true 时,替换为 `MaxLengthEnforcement.enforce`。当 `maxLengthEnforced` 为 false 时,替换为 `MaxLengthEnforcement.none`。此更改允许指定更多行为,而不仅仅是原始的二元选择,并新增了 `MaxLengthEnforcement.truncateAfterCompositionEnds` 作为附加选项。

以下所有类都有相同的 API 更改

  • TextField
  • TextFormField
  • CupertinoTextField

迁移指南

提供了详细的迁移指南

迁移前的代码

dart
const TextField textField = TextField(maxLengthEnforced: true);
const TextField textField = TextField(maxLengthEnforced: false);
final lengthEnforced = textField.maxLengthEnforced;

const TextFormField textFormField = TextFormField(maxLengthEnforced: true);
const TextFormField textFormField = TextFormField(maxLengthEnforced: false);
final lengthEnforced = textFormField.maxLengthEnforced;

const CupertinoTextField cupertinoTextField = CupertinoTextField(maxLengthEnforced: true);
const CupertinoTextField cupertinoTextField = CupertinoTextField(maxLengthEnforced: false);
final lengthEnforced = cupertinoTextField.maxLengthEnforced;

迁移后的代码

dart
const TextField textField = TextField(maxLengthEnforcement: MaxLengthEnforcement.enforce);
const TextField textField = TextField(maxLengthEnforcement: MaxLengthEnforcement.none);
final lengthEnforced = textField.maxLengthEnforcement;

const TextFormField textFormField = TextFormField(maxLengthEnforcement: MaxLengthEnforcement.enforce);
const TextFormField textFormField = TextFormField(maxLengthEnforcement: MaxLengthEnforcement.none);
final lengthEnforced = textFormField.maxLengthEnforcement;

const CupertinoTextField cupertinoTextField = CupertinoTextField(maxLengthEnforcement: MaxLengthEnforcement.enforce);
const CupertinoTextField cupertinoTextField = CupertinoTextField(maxLengthEnforcement: MaxLengthEnforcement.none);
final lengthEnforced = cupertinoTextField.maxLengthEnforcement;

参考资料

API 文档

相关问题

相关 PR


`VelocityTracker` 构造函数

#

Flutter Fix 支持:是

`VelocityTracker` 的默认构造函数在 v1.22 中被弃用。

应改用 `VelocityTracker.withKind()`。这允许为跟踪器指定 `PointerDeviceKind`。`VelocityTracker.kind` 之前的默认值为 `PointerDeviceKind.touch`。

迁移指南

迁移前的代码

dart
final VelocityTracker tracker = VelocityTracker();

迁移后的代码

dart
final VelocityTracker tracker = VelocityTracker.withKind(PointerDeviceKind.touch);

参考资料

API 文档

相关 PR


`DayPicker` 和 `MonthPicker`

#

Flutter Fix 支持:否

`DayPicker` 和 `MonthPicker` 小部件最初在 v1.15 中被弃用,然后在 v1.26 中延长了弃用期。

它们已被一个更全面的小部件 `CalendarDatePicker` 取代。

这些小部件是使用 `showDatePicker` 方法显示的。此方法在此版本之前已迁移以呈现新的 `CalendarDatePicker`,因此它们的最终移除不应需要进一步操作。

参考资料

设计文档

API 文档

相关问题

相关 PR


`FlatButton`、`RaisedButton` 和 `OutlineButton`

#

Flutter Fix 支持:否

`FlatButton`、`RaisedButton` 和 `OutlineButton` 小部件最初在 v1.20 中被弃用,然后在 v1.26 中延长了弃用期。

它们被新按钮 `TextButton`、`ElevatedButton` 和 `OutlinedButton` 取代。这些新小部件还使用新的关联主题,而不是通用的 `ButtonTheme`。

旧小部件旧主题新小部件新主题
FlatButtonButtonTheme文本按钮TextButtonTheme
RaisedButtonButtonTheme凸起按钮ElevatedButtonTheme
OutlineButtonButtonThemeOutlinedButtonOutlinedButtonTheme

迁移指南

提供了详细样式的深入迁移指南

迁移前的代码

dart
FlatButton(
  onPressed: onPressed,
  child: Text('Button'),
  // ...
);

RaisedButton(
  onPressed: onPressed,
  child: Text('Button'),
  // ...
);

OutlineButton(
  onPressed: onPressed,
  child: Text('Button'),
  // ...
);

迁移后的代码

dart
TextButton(
  onPressed: onPressed,
  child: Text('Button'),
  // ...
);

ElevatedButton(
  onPressed: onPressed,
  child: Text('Button'),
  // ...
);

OutlinedButton(
  onPressed: onPressed,
  child: Text('Button'),
  // ...
);

参考资料

设计文档

API 文档

相关 PR


`Scaffold` 的 `SnackBar` 方法

#

Flutter Fix 支持:否

以下 `Scaffold` 的 `SnackBar` 方法在 v1.23 中被弃用。

  • showSnackBar
  • removeCurrentSnackBar
  • hideCurrentSnackBar

应改用 `ScaffoldMessenger` 中同名的方法。每个 `MaterialApp` 中都已默认创建了一个 `ScaffoldMessenger`。

迁移指南

提供了详细的迁移指南

迁移前的代码

dart
Scaffold.of(context).showSnackBar(mySnackBar);
Scaffold.of(context).removeCurrentSnackBar(mySnackBar);
Scaffold.of(context).hideCurrentSnackBar(mySnackBar);

迁移后的代码

dart
ScaffoldMessenger.of(context).showSnackBar(mySnackBar);
ScaffoldMessenger.of(context).removeCurrentSnackBar(mySnackBar);
ScaffoldMessenger.of(context).hideCurrentSnackBar(mySnackBar);

参考资料

设计文档

视频内容

API 文档

相关问题

相关 PR


`RectangularSliderTrackShape.disabledThumbGapWidth`

#

Flutter Fix 支持:是

`RectangularSliderTrackShape.disabledThumbGapWidth` 最初在 v1.5 中被弃用,然后在 v1.26 中延长了弃用期。

框架不再使用此项,因为滑块拇指禁用时不再发生动画。

迁移指南

迁移前的代码

dart
RectangularSliderTrackShape(disabledThumbGapWidth: 2.0);

迁移后的代码

dart
RectangularSliderTrackShape();

参考资料

API 文档

相关 PR


将 `ThemeData` 的文本选择迁移到 `TextSelectionThemeData`

#

Flutter Fix 支持:是

以下 `ThemeData` 成员最初在 v1.23 中被弃用,并在 v1.26 中延长了弃用期。

  • useTextSelectionTheme
  • textSelectionColor
  • cursorColor
  • textSelectionHandleColor

这些应由更全面的 `TextSelectionThemeData` 取代,后者现在已在 `ThemeData` 本身中指定。

`useTextSelectionTheme` 标志作为区分这两个 API 的临时迁移标志,现在可以将其移除。

迁移指南

提供了详细的迁移指南

迁移前的代码

dart
ThemeData(
  useTextSelectionTheme: false,
  textSelectionColor: Colors.blue,
  cursorColor: Colors.green,
  textSelectionHandleColor: Colors.red,
);

迁移后的代码

dart
ThemeData(
  textSelectionTheme: TextSelectionThemeData(
    selectionColor: Colors.blue,
    cursorColor: Colors.green,
    selectionHandleColor: Colors.red,
  ),
);

参考资料

设计文档

API 文档

相关问题

相关 PR


将 `RenderEditable.onSelectionChanged` 迁移到 `TextSelectionDelegate.textEditingValue`

#

Flutter Fix 支持:否

`RenderEditable.onSelectionChanged` 和 `TextSelectionDelegate.textEditingValue` 在 v1.26 中被弃用。

应调用 `TextSelectionDelegate.userUpdateTextEditingValue` 而不是调用其中一个或这两个方法。这修复了一个 `TextInputFormatter` 会收到错误选择值的错误。

迁移指南

迁移前的代码

dart
renderEditable.onSelectionChanged(selection, renderObject, cause);
textSelectionDelegate.textEditingValue = value;

迁移后的代码

dart
textSelectionDelegate.userUpdateTextEditingValue(value, cause);

参考资料

API 文档

相关问题

相关 PR


`Stack.overflow`

#

Flutter Fix 支持:是

`Stack.overflow` 以及 `Overflow` 枚举在 v1.22 中被弃用。

替代方案是 `Stack.clipBehavior`,这是统一框架剪辑行为和语义的一部分更改。如果使用了 `Overflow.visible`,请使用 `Clip.none`。如果使用了 `Overflow.clip`,请使用 `Clip.hardEdge`。

迁移指南

提供了详细的迁移指南

迁移前的代码

dart
const Stack stack = Stack(overflow: Overflow.visible);
const Stack stack = Stack(overflow: Overflow.clip);

迁移后的代码

dart
const Stack stack = Stack(clipBehavior: Clip.none);
const Stack stack = Stack(clipBehavior: Clip.hardEdge);

参考资料

API 文档

相关问题

相关 PR


`UpdateLiveRegionEvent`

#

Flutter Fix 支持:否

`SemanticsEvent` `UpdateLiveRegionEvent` 最初在 v1.12 中被弃用,然后在 v1.26 中延长了弃用期。

框架从未实现此项,所有引用都应被移除。

参考资料

API 文档

相关 PR


`RenderObjectElement` 方法

#

Flutter Fix 支持:是

以下 `RenderObjectElement` 方法在 v1.21 中被弃用。

  • insertChildRenderObject
  • moveChildRenderObject
  • removeChildRenderObject

这些方法分别被以下方法取代:

  • insertRenderObjectChild
  • moveRenderObjectChild
  • removeRenderObjectChild

这些更改是作为软破坏性弃用而进行的,旨在更改函数签名。

迁移指南

迁移前的代码

dart
element.insertChildRenderObject(child, slot);
element.moveChildRenderObject(child, slot);
element.removeChildRenderObject(child);

迁移后的代码

dart
element.insertRenderObjectChild(child, slot);
element.moveRenderObjectChild(child, oldSlot, newSlot);
element.removeRenderObjectChild(child, slot);

参考资料

API 文档

相关问题

相关 PR


时间线

#

稳定版本:3.0.0