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

Jes*_*sse 3 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();
Run Code Online (Sandbox Code Playgroud)

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

var _textController = new TextEditingController();
Run Code Online (Sandbox Code Playgroud)

带有_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',
        ),
      ),
    ]
  )
);
Run Code Online (Sandbox Code Playgroud)

}

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

die*_*per 8

您只需要听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();
      }
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,你可以使用 AnimatedBuilder 和 ValueNotifier (2认同)