在多个屏幕中使用表单颤振“在小部件树中检测到重复的 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<FormState> _formKey = GlobalKey();
GlobalKey<FormState> _cubitFormKey = GlobalKey();
现在使用_formKey
到Form()
并将_cubitFormKey
传递到LoginCubit()
【讨论】:
以上是关于在多个屏幕中使用表单颤振“在小部件树中检测到重复的 GlobalKey”错误的主要内容,如果未能解决你的问题,请参考以下文章