Flutter 如何在颤振中从TextFormField更新变量?
我有TextFormField,它有自己的控制器。我还有一个禁用的按钮,我想在TextFormField内的任何输入之后启用它。问题是,我设法启用了按钮,但只有当我关闭键盘。例如,如果我在会话中键入一个单词,除非我关闭键盘,否则它不会启用该按钮。我想在第一个字符后启用按钮 代码如下:Flutter 如何在颤振中从TextFormField更新变量?,flutter,Flutter,我有TextFormField,它有自己的控制器。我还有一个禁用的按钮,我想在TextFormField内的任何输入之后启用它。问题是,我设法启用了按钮,但只有当我关闭键盘。例如,如果我在会话中键入一个单词,除非我关闭键盘,否则它不会启用该按钮。我想在第一个字符后启用按钮 代码如下: final TextEditingController passwordController = new TextEditingController(); TextFormField( keyboardTyp
final TextEditingController passwordController = new TextEditingController();
TextFormField(
keyboardType: TextInputType.visiblePassword,
controller: passwordController,
),
RaisedButton(
onPressed: (passwordController.text== "") ? null : () {
setState(() {
_isLoading = true;
});
signIn(email, passwordController.text);
},
),
这就是你要找的吗
final TextEditingController _controller = TextEditingController();
bool _isLoading = true;
// it tracks if TextField is enabled or disabled
bool _enabled = false;
@override
void initState() {
super.initState();
_controller.addListener(() { // you need to add listener like this
setState(() {
if (_controller.text.length > 0)
_enabled = true;
else
_enabled = false;
});
});
}
Widget build(context) {
return Scaffold(
body: Column(
children: <Widget>[
SizedBox(height: 50),
TextFormField(controller: _controller),
RaisedButton(
onPressed: !_enabled ? null : () => setState(() => _isLoading = true),
),
],
),
);
}
final TextEditingController\u controller=TextEditingController();
bool_isLoading=true;
//它跟踪TextField是启用还是禁用
bool _enabled=false;
@凌驾
void initState(){
super.initState();
_controller.addListener((){//您需要像这样添加侦听器
设置状态(){
如果(_controller.text.length>0)
_启用=真;
其他的
_启用=错误;
});
});
}
小部件构建(上下文){
返回脚手架(
正文:专栏(
儿童:[
尺寸箱(高度:50),
TextFormField(控制器:_控制器),
升起的按钮(
按下按钮:!\u已启用?null:()=>设置状态(()=>\u isLoading=true),
),
],
),
);
}
这起作用了:
var password = '';
TextFormField(
keyboardType: TextInputType.visiblePassword,
controller: passwordController,
onChanged: (value){
setState(() {
password = value;
});
},
),
RaisedButton(
onPressed: (password == "") ? null : () {
setState(() {
_isLoading = true;
});
signIn(email, password);
},
),
根据您要查找的内容,我创建了一个名为
isEnabled
的布尔值,并将初始值设置为false
。这应该适合你
bool isEnabled;
final TextEditingController passwordController = new TextEditingController();
@override
void initState() {
super.initState();
passwordController.addListener(() {
setState(() {
if (passwordController.text.length > 0) {
isEnabled = true;
} else {
isEnabled = false;
}
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: <Widget>[
TextFormField(
keyboardType: TextInputType.visiblePassword,
controller: passwordController,
),
RaisedButton(
child: Text('Click Me'),
onPressed: isEnabled ? () {
//print('Button has been pressed');
setState(() {
_isLoading = true;
});
signIn(email, passwordController.text);
} : null,
),
],
),
);
}
bool已启用;
final TextEditingController密码控制器=新TextEditingController();
@凌驾
void initState(){
super.initState();
passwordController.addListener((){
设置状态(){
if(passwordController.text.length>0){
isEnabled=true;
}否则{
isEnabled=false;
}
});
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:专栏(
儿童:[
TextFormField(
键盘类型:TextInputType.visiblePassword,
控制器:密码控制器,
),
升起的按钮(
子:文本(“单击我”),
已按下:isEnabled?(){
//打印('按钮已按下');
设置状态(){
_isLoading=true;
});
登录(电子邮件、passwordController.text);
}:null,
),
],
),
);
}
您可以简单地使用来自的onChange(value)
回调。我本来想说这也不起作用,但后来我意识到我忘记设置state了。谢谢,不太好_isLoading用于在异步登录过程中显示加载栏。@Sprowk好的,我相应地更改了代码,请查看更新的答案。