我有一个简单的登录屏幕,其中包含电子邮件和密码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
}
答案 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
方法