Flutter点击按钮打开EndDrawer触发空检查错误求助
解决Flutter中点击按钮打开侧抽屉时的Null Check错误
问题原因
你定义了GlobalKey<ScaffoldState>但未将其绑定到Scaffold组件,导致_scaffoldKey.currentState为null,调用!强制解包时触发Null check operator used on a null value错误。
修复步骤
- 给Scaffold绑定key:在Scaffold的参数中添加
key: _scaffoldKey,让全局key与当前Scaffold实例关联。 - 优化方法避免强制解包:在调用
openEndDrawer()前先判断currentState是否存在,提升代码健壮性。
修改后的代码示例
class _MyHomePageState extends State<MyHomePage> { final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); void _openEndDrawer(){ // 先判断currentState是否存在,再调用方法 _scaffoldKey.currentState?.openEndDrawer(); } void _closeEndDrawer(){ Navigator.of(context).pop(); } @override Widget build(BuildContext context) { return Scaffold( // 关键:给Scaffold绑定key key: _scaffoldKey, appBar: HEADER(appBar: new AppBar()), drawer: LeftPanel(drawer: new Drawer()), endDrawer: Drawer( child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ const Text('This is the Drawer'), ElevatedButton( onPressed: _closeEndDrawer, child: const Text('Close Drawer'), ) ], ), ), ), body: Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.center, children: [ SectionTitle(title: "Historial"), Padding( padding: EdgeInsets.fromLTRB(10, 30, 0, 0), child: IconButton( icon: Icon(Icons.filter_alt), onPressed: _openEndDrawer, ), ) ], ) ], ), ); } }
补充说明
- GlobalKey的作用是跨组件获取对应Widget的State实例,必须和目标Widget绑定才能生效。
- 使用
?.可选链调用代替!强制解包,即使currentState为null也不会崩溃,而是静默跳过执行,更适合生产环境代码。
内容的提问来源于stack exchange,提问作者k1k4ss0
相关产品推荐
相关产品推荐

