在关闭键盘之前,如何基于LoginInputField更新屏幕?

时间:2019-03-27 03:29:08

标签: dart flutter

我有一个简单的登录屏幕,其中包含电子邮件和密码LoginInputField。字段为空时,登录按钮将变灰并禁用。当它们都包含文本时,将启用该按钮。我的工作正常,但是直到用户关闭键盘后它才会更新。我希望用户无需先关闭键盘即可单击按钮。

我在LoginInputFields上有TextEdditingControllers,并在构建期间检查控制器的状态并进行相应的设置。

class LoginState extends State<Login> {

    final emailController = TextEditingController();
    final passwordController = TextEditingController();
    ButtonStyle loginButtonStyle;
    bool loginDisabled = true;

    void setLoginButtonStyle(){
      if(emailController.text != '' && passwordController.text != ''){
        setState(() {
          this.loginButtonStyle = buttonPrimary;
        });
        loginDisabled = false;
      } else {
        this.loginButtonStyle = buttonDisabled;
        loginDisabled = true;
      }
    }

  @override
  Widget build(BuildContext context) {
  setLoginButtonStyle();
  //build widgets
  RoundedButton(
    buttonText: 'Log In',
    buttonStyle: loginButtonStyle,
    onPressed: () {
                    if (!loginDisabled){
                      //login through server
                    } 
                  },
    ),
    //more widgets
  }

1 个答案:

答案 0 :(得分:1)

您应该听TextEditingController进行每次更改。

     @override
    void initState() {
      emailController.addListener(setLoginButtonStyle);
      passwordController.addListener(setLoginButtonStyle);
      super.initState();
    }

    @override
    void dispose() {
      emailController.dispose();
      passwordController.dispose();
      super.dispose();
    }

    void setLoginButtonStyle(){
  if(emailController.text != '' && passwordController.text != ''){
    this.loginButtonStyle = buttonPrimary;
    loginDisabled = false;
  } else {
    this.loginButtonStyle = buttonDisabled;
    loginDisabled = true;
  }

   setState(() {
    });
  }

还可以删除此行setLoginButtonStyle();。通过您的build方法