使用流时如何清除文本字段文本?

时间:2019-04-08 15:20:59

标签: flutter

我想从凸起按钮的onPressed清除文本。请注意,我知道我可以使用有状态的小部件并设置状态。但是我试图避免使主页成为有状态的小部件,而是使用块模式和流。考虑到这一点,我如何清除文本字段的文本?

TextBox

2 个答案:

答案 0 :(得分:0)

如果要使用TextEditingController。您必须使用StatefulWidget。正如文档所述,您必须将控制器放置在小部件的dispose()方法中。

正确的方式

class TextEditingExample extends State<MyHomePage> {
  final _controller = TextEditingController();
  void initState() {
    _controller.addListener(() {
      final text = _controller.text.toLowerCase();
      _controller.value = _controller.value.copyWith(
        text: text,
        selection:
            TextSelection(baseOffset: text.length, extentOffset: text.length),
        composing: TextRange.empty,
      );
    });
    super.initState();
  }

  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        alignment: Alignment.center,
        padding: const EdgeInsets.all(6),
        child: Column(
          children: <Widget>[
            TextFormField(
              controller: _controller,
              decoration: InputDecoration(border: OutlineInputBorder()),
            ),
            RaisedButton(
              onPressed: () {
                _controller.clear();
                _controller.dispose();
              },
              child: Icon(Icons.add),
            )
          ],
        ),
      ),
    );
  }
}

方法不正确,但适合您的用例。

class HomePage extends StatelessWidget {
  final TextEditingController _controller = new TextEditingController();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: <Widget>[
          StreamBuilder<String>(
              //stream: bloc.getTextStream,
              builder: (context, snapshot) {
            return TextField(
              controller: _controller,
              //  onChanged: bloc.addString,
              decoration: InputDecoration.collapsed(
                hintText: 'Category@Value',
              ),
            );
          }),
          RaisedButton(
            onPressed: () {
              _controller.clear();
              //disposing right way after using it, because it has to be diposed
              // and there is no way we can dispose it in StatelessWidget
              _controller.dispose();
            },
            child: Icon(Icons.add),
          )
        ],
      ),
    );
  }
}

答案 1 :(得分:0)

不知道能不能帮到你。这是我的简单解决方案。只需将 null 分配给您的流控制器。

bloc.getTextStream.add(null);