Flutter 在生成过程中调用setState()或markNeedsBuild()。无法标记此LoginsScreenWidget,因为framwork已在生成小部件的过程中
当我在表单中使用“AutovalidateMode”时,我遇到了这个错误 当我按下登录按钮时,它显示了这个特定的错误。此外,我无法使用autovalidate inside form,因为它已经从Flatter 2.0.4中删除。Flutter 在生成过程中调用setState()或markNeedsBuild()。无法标记此LoginsScreenWidget,因为framwork已在生成小部件的过程中,flutter,Flutter,当我在表单中使用“AutovalidateMode”时,我遇到了这个错误 当我按下登录按钮时,它显示了这个特定的错误。此外,我无法使用autovalidate inside form,因为它已经从Flatter 2.0.4中删除。 这是我的代码… 导入“包装:颤振/材料.省道”; 类LoginScreen扩展StatefulWidget{ LoginScreen({Key}):超级(Key:Key); @凌驾 _LoginsScreenState createState()=>\u Login
这是我的代码…
导入“包装:颤振/材料.省道”;
类LoginScreen扩展StatefulWidget{
LoginScreen({Key}):超级(Key:Key);
@凌驾
_LoginsScreenState createState()=>\u LoginsScreenState();
}
类_LoginScreenState扩展状态{
最终GlobalKey _scaffoldKey=新的GlobalKey();
最终的GlobalKey _formKey=GlobalKey();
final TextEditingController_emailController=TextEditingController();
AutovalidateMode _autoValidate=AutovalidateMode.disabled;
@凌驾
小部件构建(构建上下文){
返回脚手架(
resizeToAvoidBottomInset:true,
钥匙:_scaffoldKey,
bottomNavigationBar:getBottomNavbar(上下文),
正文:SingleChildScrollView(
孩子:表格(
键:_formKey,
autovalidateMode:\u autoValidate,
子:列(
儿童:[
CustomTextFieldWidget(
控制器:\u电子邮件控制器,
验证器:(值){
if(value.isEmpty){
设置状态(){
emailValidate=true;
});
返回“请输入电子邮件”;
}else if(!\u emailController.text
.contains(EmailValidator.regex)){
设置状态(){
emailValidate=true;
});
返回“输入有效电子邮件!”;
}否则{
设置状态(){
emailValidate=true;
});
返回null;
}
},
类型:TextInputType.emailAddress,
textcapitalize:textcapitalize.words,
hintValue:“电子邮件”,
前缀:“assets/image/profile/mail.png”,
iError:emailValidate,
textCallback:(字符串值){
如果(_autoValidate==AutovalidateMode.always)
_formKey.currentState.validate();
},
),
],
),
),
),
);
}
getBottomNavbar(构建上下文){
返回AppButton.flat(
菲特:是的,
onTap:(){
if(_formKey.currentState.validate()){
设置状态(){
加载=真;
});
loginCall();
}否则{
_autoValidate=AutovalidateMode.always;
}
},
文本:“登录”,
textColor:Colors.black,
背景色:原色,
);
}
}
我尝试了其他stackoverflow答案,但对我来说没有效果。尝试根据布尔值切换表单自动验证值,如下所示
child: Form(key: _formKey,
autovalidateMode: _autoValidate ? AutovalidateMode.always : AutovalidateMode.disabled,
在验证程序中调用setState is Not是不对的,因为在构建函数尚未完成时调用setState,或者在屏幕上绘制小部件时调用setState,所以我建议您公开textfield的onChanged方法,并在那里执行验证部分,如果输入无效,验证程序函数应返回包含错误消息的字符串。如果没有错误,验证程序必须返回null
CustomTextFieldWidget(
controller: _emailController,
onChanged:(value){
if (value.isEmpty || !_emailController.text.contains(EmailValidator.regex)) {
setState(() {
emailValidate = true;
});
}else{
setState(() {
emailValidate = true;
});
}
},
validator: (value) {
if(value.isEmpty) {
return 'Please Enter E-mail';
} else if (!_emailController.text.contains(EmailValidator.regex)) {
return 'Enter valid email !';
} else {
return null;
}
},
type: TextInputType.emailAddress,
textCapitalization: TextCapitalization.words,
hintValue: "Email",
prefixIcon: "assets/image/profile/mail.png",
iserror: emailValidate,
textCallback: (String value) {
if (_autoValidate == AutovalidateMode.always)
_formKey.currentState.validate();
},
),
谢谢你的回答,兄弟,但是如果我使用布尔值,那么实际上我根本不需要设置autovalidateMode。我可以把条件根据布尔值直接放在验证器里面正确!您必须处理每个表单字段的逻辑!
CustomTextFieldWidget(
controller: _emailController,
onChanged:(value){
if (value.isEmpty || !_emailController.text.contains(EmailValidator.regex)) {
setState(() {
emailValidate = true;
});
}else{
setState(() {
emailValidate = true;
});
}
},
validator: (value) {
if(value.isEmpty) {
return 'Please Enter E-mail';
} else if (!_emailController.text.contains(EmailValidator.regex)) {
return 'Enter valid email !';
} else {
return null;
}
},
type: TextInputType.emailAddress,
textCapitalization: TextCapitalization.words,
hintValue: "Email",
prefixIcon: "assets/image/profile/mail.png",
iserror: emailValidate,
textCallback: (String value) {
if (_autoValidate == AutovalidateMode.always)
_formKey.currentState.validate();
},
),