📜  颤振 textformfield 清除值 (1)

📅  最后修改于: 2023-12-03 15:42:29.743000             🧑  作者: Mango

颤振 TextField 清除值

当我们使用 Flutter 中的 TextField 组件时,有时候需要在用户输入文本后清空其值。为了实现这一目标,我们可以使用颤振 (Shake) 动画来清除 TextField 的值。

如何实现颤振动画?

我们可以使用 Flutter 的动画库 (Animations) 来实现颤振动画。具体步骤如下:

  1. 首先,我们需要在 StatefulWidget 中定义一个 TextEditingController 对象,这个对象将用来监听并更新 TextField 的值。
  final TextEditingController _controller = TextEditingController();
  1. 然后,我们需要实现一个 clear 方法来清除 TextField 的值。该方法将会根据输入框当前的值来执行颤振动画,以使用户能够明确认识到值已被清除。
  void clear() {
    setState(() {
      _controller.clear();
    });

    // 定义一个颤振动画
    _animationController = AnimationController(
      duration: Duration(milliseconds: 200),
      vsync: this,
    );
    _animationController.forward(from: 0.0);
  }
  1. 在 Widget 的 build 方法中,我们需要为 TextField 指定一个 controller,并将动画添加到输入框。
  @override
  Widget build(BuildContext context) {
    return TextFormField(
      controller: _controller,
      decoration: InputDecoration(
        labelText: 'Enter text to clear',
      ),
      validator: (value) {
        if (value.isEmpty) {
          return 'Please enter some text';
        }
        return null;
      },
      // 添加动画到输入框
      inputFormatters: [
        ShakeFormatter(
          animationController: _animationController,
          valueChanged: () {
            setState(() {}); // 触发重绘
          },
        ),
      ],
    );
  }
  1. 最后,我们需要定义一个 ShakeFormatter 类来管理颤振动画。在该类中,我们需要重写 Formatter 的 formatEditUpdate 方法来触发动画效果。
class ShakeFormatter extends TextInputFormatter {
  final AnimationController animationController;
  final ValueChanged valueChanged;

  ShakeFormatter({
    this.animationController,
    this.valueChanged,
  });

  @override
  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, TextEditingValue newValue) {
    if (newValue.text.isEmpty) {
      animationController.forward(from: 0.0);
      valueChanged();
    }
    return newValue;
  }
}
完整代码示例
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

class ClearableTextField extends StatefulWidget {
  const ClearableTextField({Key key}) : super(key: key);

  @override
  _ClearableTextFieldState createState() => _ClearableTextFieldState();
}

class _ClearableTextFieldState extends State<ClearableTextField>
    with SingleTickerProviderStateMixin {
  final TextEditingController _controller = TextEditingController();
  AnimationController _animationController;

  void clear() {
    setState(() {
      _controller.clear();
    });

    _animationController = AnimationController(
      duration: Duration(milliseconds: 200),
      vsync: this,
    );
    _animationController.forward(from: 0.0);
  }

  @override
  Widget build(BuildContext context) {
    return TextFormField(
      controller: _controller,
      decoration: InputDecoration(
        labelText: 'Enter text to clear',
      ),
      validator: (value) {
        if (value.isEmpty) {
          return 'Please enter some text';
        }
        return null;
      },
      inputFormatters: [
        ShakeFormatter(
          animationController: _animationController,
          valueChanged: () {
            setState(() {}); // 触发重绘
          },
        ),
      ],
    );
  }
}

class ShakeFormatter extends TextInputFormatter {
  final AnimationController animationController;
  final ValueChanged valueChanged;

  ShakeFormatter({
    this.animationController,
    this.valueChanged,
  });

  @override
  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, TextEditingValue newValue) {
    if (newValue.text.isEmpty) {
      animationController.forward(from: 0.0);
      valueChanged();
    }
    return newValue;
  }
}

以上是 Flutter 中实现颤振 TextField 清除值的方法。来试试看吧!