下面是一个对话框,可使用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可以监听更改?
答案 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/