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

Posted

技术标签:

【中文标题】在多个屏幕中使用表单颤振“在小部件树中检测到重复的 GlobalKey”错误【英文标题】:Flutter Using Form in Multiple Screens "Duplicate GlobalKey detected in widget tree" Error 【发布时间】:2021-06-01 00:44:40 【问题描述】:

我为我使用“GlobalKey _formKey = GlobalKey();”的关键部分创建了一个带有表单的登录页面它工作正常没问题。登录页面后,我想创建一个弹出屏幕,然后像在登录页面中一样制作所有内容。不幸的是,我收到此“在小部件树中检测到重复的 GlobalKey”错误。我尝试了很多我在网上看到的东西,但都没有奏效。我的密钥不是静态的,也不是最终的。我也尝试了登录页面的 pushReplacement ,但它也不起作用。我只是想在应用程序的不同页面中使用表单,它们之间没有任何联系。

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....

Popup 的实现方式相同

【问题讨论】:

【参考方案1】:

问题是您将相同的_formKey 传递给LoginCubit(),因此在这种情况下,您在不同的地方使用相同的GlobalKey()

创建两个单独的GlobalKey() 并在两个地方使用它们。

GlobalKey&lt;FormState&gt; _formKey = GlobalKey(); GlobalKey&lt;FormState&gt; _cubitFormKey = GlobalKey();

现在使用_formKeyForm() 并将_cubitFormKey 传递到LoginCubit()

【讨论】:

以上是关于在多个屏幕中使用表单颤振“在小部件树中检测到重复的 GlobalKey”错误的主要内容,如果未能解决你的问题,请参考以下文章

在小部件树中检测到重复的 GlobalKey

如何使用 Flutter Web 处理来自提供商的全局密钥?

如何在颤振项目的一个屏幕中使用多个 Admob 横幅

双击按钮时如何修复颤振中的多个导航

在路线之间去除颤振导航

使用颤振将多个参数传递给命名路由