Forms 在多个屏幕中使用表格“颤振”;在小部件树中检测到重复的GlobalKey“;错误

Forms 在多个屏幕中使用表格“颤振”;在小部件树中检测到重复的GlobalKey“;错误,forms,flutter,key,Forms,Flutter,Key,我使用“GlobalKey _formKey=GlobalKey();”为我使用的关键部分创建了一个带有表单的登录页面,它工作正常,没有问题。在登录一个页面后,我想创建一个弹出屏幕,我会像在登录页面中一样进行所有操作。不幸的是,我得到了这个“在小部件树中检测到重复的GlobalKey”错误。我尝试了很多我在网上看到的东西,但没有一个奏效。我的钥匙不是静态的,不是最终的。此外,我还尝试替换登录页面,但它也不起作用。我只是尝试在应用程序中的不同页面中使用表单,但它们之间并没有任何连接 class B

我使用“GlobalKey _formKey=GlobalKey();”为我使用的关键部分创建了一个带有表单的登录页面,它工作正常,没有问题。在登录一个页面后,我想创建一个弹出屏幕,我会像在登录页面中一样进行所有操作。不幸的是,我得到了这个“在小部件树中检测到重复的GlobalKey”错误。我尝试了很多我在网上看到的东西,但没有一个奏效。我的钥匙不是静态的,不是最终的。此外,我还尝试替换登录页面,但它也不起作用。我只是尝试在应用程序中的不同页面中使用表单,但它们之间并没有任何连接

class Body extends StatelessWidget {
  GlobalKey<FormState> _formKey = GlobalKey();
  final TextEditingController emailContoller = TextEditingController();
  final TextEditingController passwordContoller = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return BlocProvider(
        create: (context) => LoginCubit(
              emailContoller,
              passwordContoller,
              _formKey,
            ),
        child: BlocConsumer<LoginCubit, LoginState>(
          listener: (context, state) {
            if (state is LoginComplete) {
              CacheManager.instance.addCacheItem(
                  '${state.loginResultModel.userID}', state.loginResultModel);
              state.navigate(context);
            } else if (state is LoginError) {
              ScaffoldMessenger.of(context)
                  .showSnackBar(SnackBar(content: Text(state.message)));
            }
          },
          builder: (context, state) {
            return buildBackground(context, state);
          },
        ));
  }

  Background buildBackground(BuildContext context, LoginState state) {
    Size size = MediaQuery.of(context).size;
    return Background(
      
      child: Stack(children: [
        Form(
          key: _formKey,
          autovalidateMode: autovalidateMode(state),
          child: SingleChildScrollView(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  "LOGIN",
                  style: TextStyle(fontWeight: FontWeight.bold),
                ),
                //TextFormFields and buttons....

类主体扩展了无状态小部件{
GlobalKey _formKey=GlobalKey();
final TextEditingController emailContoller=TextEditingController();
最终TextEditingController密码控制器=TextEditingController();
@凌驾
小部件构建(构建上下文){
返回BlocProvider(
创建:(上下文)=>LoginCubit(
emailContoller,
密码控制器,
_formKey,
),
孩子:女顾客(
侦听器:(上下文、状态){
如果(状态为LoginComplete){
CacheManager.instance.addCacheItem(
“${state.loginResultModel.userID}”,state.loginResultModel);
状态。导航(上下文);
}else if(状态为LoginError){
脚手架信使(上下文)
.showSnackBar(SnackBar(内容:Text(state.message)));
}
},
生成器:(上下文、状态){
返回buildBackground(上下文、状态);
},
));
}
后台buildBackground(BuildContext上下文,LoginState状态){
Size Size=MediaQuery.of(context).Size;
返回背景(
子:堆栈(子:[
形式(
键:_formKey,
autovalidateMode:autovalidateMode(状态),
子:SingleChildScrollView(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
正文(
“登录”,
样式:TextStyle(fontWeight:fontWeight.bold),
),
//TextFormFields和buttons。。。。

Popup具有相同的实现

问题是您正在将相同的
\u formKey
传递给
LoginCubit()
,因此在本例中,您在不同的位置使用相同的
GlobalKey()

创建两个单独的
GlobalKey()
,并在两个位置使用它们

GlobalKey\u formKey=GlobalKey();
GlobalKey\u cubitFormKey=GlobalKey();

现在使用
\u formKey
Form()
并将
\u cubitFormKey
传递到
LoginCubit()