在小部件树中检测到 Flutter Duplicate GlobalKey

Posted

技术标签:

【中文标题】在小部件树中检测到 Flutter Duplicate GlobalKey【英文标题】:Flutter Duplicate GlobalKey detected in widget tree 【发布时间】:2021-07-30 23:07:33 【问题描述】:

我在切换到另一个页面(从登录到仪表板页面)时遇到这个问题。

错误:

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

... 由于 GlobalKey reparenting 导致一个或多个孩子被强制移除后未更新的特定 parent 是:

扩展(弹性:1)

代码:

class LoginPage extends StatelessWidget 
  final GlobalKey<ScaffoldState> _key = GlobalKey<ScaffoldState>();
  final FocusNode passFocus = FocusNode();
  final FocusNode emailFocus = FocusNode();

  @override
  Widget build(BuildContext context) 
    final authProvider = Provider.of<AuthProvider>(context);

    return authProvider.status == Status.Authenticating
        ? Loading()
        : Scaffold(
          key: _key,
            body: ...

class LayoutTemplate extends StatelessWidget 
  final GlobalKey<ScaffoldState> _key = GlobalKey<ScaffoldState>();

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      key: _key,
      body: ...

这是我的导航服务:

class NavigationService 
  final GlobalKey<NavigatorState> navigatorKey =
  GlobalKey<NavigatorState>();

  Future<dynamic> navigateTo(String routeName, ArgumentsClass arguments) 
    return navigatorKey.currentState.pushNamed(routeName, arguments: arguments);
  

  Future<dynamic> globalNavigateTo(String routeName, BuildContext context) 
    return Navigator.of(context).pushNamed(routeName);
  

  void goBack() 
    return navigatorKey.currentState.pop();
  

【问题讨论】:

【参考方案1】:

您已在导航服务中创建了一个密钥并将其发送到任何地方 脚手架键是一种独特的东西,您必须创建并仅在一个特定页面中使用它

【讨论】:

在 LayoutTemplate 类中,我有 Navigator 子项:child:Navigator(key: locator().navigatorKey, onGenerateRoute: generateRoute, initialRoute: HomeRoute, ),

以上是关于在小部件树中检测到 Flutter Duplicate GlobalKey的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

如何在小部件的容器内显示 pdf [flutter-web]

Flutter:在小部件测试中测试异常

Flutter/Dart:我的小部件树中可以有多个带有状态的小部件吗?