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
相关产品推荐
相关产品推荐

