如何在Navigator.push跳转后关闭Scaffold树中的Drawer,返回时默认收起
Flutter Drawer跳转页面后返回仍展开的解决方案
问题根因
Flutter中打开Drawer本质是往当前导航栈压入了一个Drawer专属的模态路由,若未手动关闭Drawer就直接跳转新页面,Drawer的路由会保留在栈中,pop返回新页面时就会回到Drawer展开的状态。
解决方案
无需修改路由跳转逻辑,仅需在跳转新页面前主动关闭Drawer即可,不影响AppBar返回按钮的正常使用,有两种常用实现方式:
方式1:直接pop关闭Drawer
Drawer打开状态下,当前导航栈最上层为Drawer的模态路由,直接调用pop即可关闭:
ListTile( title: const Text('跳转第二页'), onTap: () { // 先关闭Drawer Navigator.pop(context); // 再正常跳转第二页,返回逻辑不受任何影响 Navigator.push( context, MaterialPageRoute(builder: (context) => const SecondPage()), ); }, )
方式2:调用Scaffold内置方法关闭(更稳妥,避免context冲突)
如果存在context层级混乱导致pop误关其他页面的情况,可以用Scaffold提供的专属关闭方法:
ListTile( title: const Text('跳转第二页'), onTap: () { // 关闭当前Scaffold绑定的Drawer Scaffold.of(context).closeDrawer(); // 如果是右侧侧边栏,调用 Scaffold.of(context).closeEndDrawer(); Navigator.push( context, MaterialPageRoute(builder: (context) => const SecondPage()), ); }, )
方案说明
该方案保持了原生的Navigator.push逻辑,导航栈结构为[首页路由, 第二页路由],点击AppBar返回按钮可以正常回到首页,且Drawer已经提前关闭,返回后默认是收起状态,完全满足需求,不需要使用会销毁首页的pushReplacementNamed方法。
内容的提问来源于stack exchange,提问作者NM AA
相关产品推荐
相关产品推荐

