You need to enable JavaScript to run this app. 如何在Navigator.push跳转后关闭Scaffold树中的Drawer,返回时默认收起
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 18:48:02