如何使用 TextEditingController 创建带有清除按钮的 TextField?

aki*_*han 1 dart flutter flutter-layout

我尝试创建一个带有清除按钮的文本字段,但是当我输入某些值时,没有按我想要的方式显示清除按钮。似乎它无法检测到_firstNameController.text. 我该如何解决这个问题?

在此输入图像描述

class TextFieldWithClearBtn extends StatefulWidget {
  @override
  _TextFieldWithClearBtnState createState() => _TextFieldWithClearBtnState();
}

class _TextFieldWithClearBtnState extends State<TextFieldWithClearBtn> {
  final TextEditingController _firstNameController = TextEditingController();

  @override
  void dispose {
    super.dispose();
    _firstNameController.dispose();
  }
  @override
  Widget build(BuildContext context) {
    return Container(
      child: TextFormField(
        controller: _firstNameController,
        decoration: InputDecoration(
          labelText: "First name",
          suffixIcon: _firstNameController.text.isNotEmpty
            ? GestureDetector(
              onTap: () {
                WidgetsBinding.instance.addPostFrameCallback((_) => _firstNameController.clear());
              },
              child: Icon(Icons.clear, color: Colors.black38),
            )
            : null
        ),
      ),
    );
  }
}

Run Code Online (Sandbox Code Playgroud)

Dar*_*han 5

而不是suffixIcon,你suffix。这样,如果未聚焦,该clear按钮将不可见,并且当您点击该字段时,该按钮将显示 。此外,当您在输入内容后点击该图标时,它会清除该字段。下面的工作示例代码:textformfieldiconclear

TextFormField(
      controller: _firstNameController,
                      textAlign: TextAlign.left,
                      cursorColor: Colors.white,
                      onChanged: (value) {

                      },
                      style: TextStyle(color: Colors.white),
                      decoration: InputDecoration(    
                        labelText: 'First Name',
                        suffix: GestureDetector(
                        onTap: () {
                          _firstNameController.clear();
                        },
                          child: Icon(Icons.clear)
                        )
                      ),
                    ),
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。