颤抖地侦听来自其他小部件的textField值更改

时间:2018-12-11 05:27:55

标签: dart flutter

下面是一个对话框,可使用textField和按钮捕获用户输入。当textField为空时,该按钮被禁用,但是当textField中填充值时,该按钮继续变为禁用。这是因为_textController.text状态没有被更新(在此小部件中再次呈现)。

void _pushAdd() async {
await showDialog(
  context: this.context,
  builder: (BuildContext context) {
    return AlertDialog(
      title: Text('Add a custom word'),
      content: _renderForm(),
      actions: <Widget>[
        FlatButton(
          child: Text('ADD'),
          onPressed: (_textController.text.isNotEmpty) ? () =>  _addNewPair() : null,
        ),
      ],
    );
  },
);
// Changed _pushAdd as async to handle onClose and clear _textController upon exit
_textController.clear();

当前_textController在顶部的类中初始化(不是init)。

var _textController = new TextEditingController();

带有_textController的textField位于此处:

Widget _renderForm() {
return Container(
  height: 50.0,
  child: Column(
    crossAxisAlignment: CrossAxisAlignment.start,
    children: [
      TextField(
        autofocus: true,
        textCapitalization: TextCapitalization.words,
        controller: _textController,
        decoration: InputDecoration(
          hintText: 'RedPotato',
        ),
      ),
    ]
  )
);

}

我最初的计划是使用onChanged:+另一种存储文本的状态。但是,我怀疑这样做是否有效。 我想问一下,实时处理TextField值的标准方法是什么,以便其他Widget可以监听更改?

2 个答案:

答案 0 :(得分:3)

您只需要听TextEditingController进行文本更改即可。

      var _textController = TextEditingController();

      @override
      void dispose() {
        // Clean up the controller when the Widget is disposed
        _textController.dispose();
        super.dispose();
      }

      @override
      void initState() {
        _textController.addListener((){
            //here you have the changes of your textfield
            print("value: ${_textController.text}");
            //use setState to rebuild the widget
            setState(() {

                    });
        });
        super.initState();
      }

有关更多信息,请检查此链接:https://flutter.io/docs/cookbook/forms/retrieve-input

答案 1 :(得分:0)

如果您使用的是Flutter的Dialog而不是特定的小部件(例如本示例),则下面的链接会很有帮助。

https://www.didierboelens.com/2018/05/hint-5-how-to-refresh-the-content-of-a-dialog-via-setstate/