Flutter 如何在颤振中从TextFormField更新变量?

Flutter 如何在颤振中从TextFormField更新变量?,flutter,Flutter,我有TextFormField,它有自己的控制器。我还有一个禁用的按钮,我想在TextFormField内的任何输入之后启用它。问题是,我设法启用了按钮,但只有当我关闭键盘。例如,如果我在会话中键入一个单词,除非我关闭键盘,否则它不会启用该按钮。我想在第一个字符后启用按钮 代码如下: final TextEditingController passwordController = new TextEditingController(); TextFormField( keyboardTyp

我有TextFormField,它有自己的控制器。我还有一个禁用的按钮,我想在TextFormField内的任何输入之后启用它。问题是,我设法启用了按钮,但只有当我关闭键盘。例如,如果我在会话中键入一个单词,除非我关闭键盘,否则它不会启用该按钮。我想在第一个字符后启用按钮

代码如下:

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好的,我相应地更改了代码,请查看更新的答案。