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

Flutter嵌套路由下Scaffold的AppBar不显示返回导航按钮问题求解

问题原因

AppBar自动展示返回按钮的逻辑是:判断当前页面所属的Navigator路由栈深度是否大于1。你嵌套的内部Navigator初始栈中仅有MyChildPageRoot一个路由,所以AppBar不会自动生成返回按钮。而硬件返回键优先响应根Navigator的pop逻辑,因此可以正常回到首页。

解决方案

无需调整现有路由结构和命名路由逻辑,仅需要在MyChildPageRoot的AppBar中手动添加根路由返回按钮即可,修改后的关键代码如下:

class MyChildPageRoot extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Child page'),
        // 新增leading逻辑:内部路由栈仅有1层时显示返回根导航的按钮
        leading: ModalRoute.of(context)?.canPop == false
            ? IconButton(
                icon: const Icon(Icons.arrow_back),
                onPressed: () => Navigator.of(context, rootNavigator: true).pop(),
              )
            : null,
      ),
      // 剩余原有代码保持不变
      body: Container(
          child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [
        Center(child: Text('This is child page root ')),
        Center(
            child: OutlinedButton(
                child: Text('Visit sub child page 1'),
                onPressed: () {
                  Navigator.pushNamed(context, '/child_1');
                })),
        Center(
            child: OutlinedButton(
                child: Text('Visit sub child page 2'),
                onPressed: () {
                  Navigator.pushNamed(context, '/child_2');
                })),
      ])),
    );
  }
}

效果说明

修改后:

  • 进入MyChildPageRoot页面时,左上角会显示返回按钮,点击可回到根路由的首页
  • 进入MyChildPage1、MyChildPage2等子页面时,AppBar会自动生成内部路由的返回按钮,点击可回到内部导航的上一级
  • 硬件返回键逻辑保持不变,符合预期
  • 完全保留了多Navigator结构和命名路由的使用方式,无需将内部路由定义到顶层MaterialApp中

内容的提问来源于stack exchange,提问作者user3056783

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 16:54:01