You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter使用Drawer时出现GlobalKey重复使用错误求助

解决Flutter中GlobalKey重复使用导致的黑屏问题

问题原因

你代码里的_scaffoldKey是定义在HomePage类外部的全局变量,当登录跳转后出现两个HomePage实例时,它们会共享同一个GlobalKey。而GlobalKey的规则是同一时间只能绑定到组件树中的一个组件,这就触发了断言错误,导致屏幕变黑。

解决方案

方案1:将GlobalKey移到State类内部(推荐)

把_scaffoldKey定义为_HomePageState的成员变量,这样每个HomePage实例都会拥有独立的GlobalKey,不会出现冲突。修改后的代码如下:

class HomePage extends StatefulWidget {
  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  String uid = FirebaseAuth.instance.currentUser!.uid;
  // 将GlobalKey移至State内部,每个实例独立拥有
  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: _willPopCallback,
      child: Scaffold(
        key: _scaffoldKey,
        endDrawer: Drawer(
          child: ListView(
            children: [
              ...
            ],
          ),
        ),
        appBar: AppBar(
          automaticallyImplyLeading: false,
          actions: [
            IconButton(
                onPressed: () {
                  showProfileDialog(context, uid: uid);
                },
                icon: const Icon(Icons.account_circle, size: 30)),
            IconButton(
              onPressed: () {
                _scaffoldKey.currentState!.openEndDrawer();
              },
              icon: const Icon(
                Icons.dehaze_sharp,
                size: 30,
              ),
            ),
            const SizedBox(width: 10)
          ],
        ),
        body: Center(
          child: 
           ...   
          ),
        ),
      ),
    );
  }
}

Future<bool> _willPopCallback() async {
  return true;
}

// 移除原来外部的GlobalKey定义

方案2:确保跳转时只存在一个HomePage实例

如果不想修改GlobalKey的位置,可以在登录跳转时使用Navigator.pushReplacement替代Navigator.push,这样旧的页面会被从导航栈中移除,不会同时存在两个HomePage实例:

// 登录成功后的跳转代码
Navigator.pushReplacement(
  context,
  MaterialPageRoute(builder: (context) => HomePage()),
);

说明

方案1是更合理的做法,符合Flutter组件的封装原则,每个组件实例管理自己的状态和Key,避免全局变量带来的潜在问题,也更利于后续代码维护。

内容的提问来源于stack exchange,提问作者wasa-bi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:30:56