Flutter 在生成过程中调用setState()或markNeedsBuild()。无法标记此LoginsScreenWidget,因为framwork已在生成小部件的过程中

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

当我在表单中使用“AutovalidateMode”时,我遇到了这个错误 当我按下登录按钮时,它显示了这个特定的错误。此外,我无法使用autovalidate inside form,因为它已经从Flatter 2.0.4中删除。
这是我的代码…

导入“包装:颤振/材料.省道”;
类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();
       },
   ),