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

Flutter共享Drawer导航报错:Navigator上下文异常求助

Drawer导航时抛出Navigator上下文异常的问题

执行Drawer内的导航操作时,抛出以下异常:

FlutterError (Navigator operation requested with a context that does not include a Navigator.
The context used to push or pop routes from the Navigator must be that of a widget that is a descendant of a Navigator widget.)

我有一个继承自StatelessWidget的共享Drawer,所有页面都通过Scaffold加载该Drawer(所有页面均以Scaffold开头,应用以MaterialApp启动)。尝试过直接pop路由、用Builder包装导航按钮等多种修复方法,但都无效。

Drawer代码

import 'package:arcadious/home.dart';
import 'package:flutter/material.dart';

class ArcadiousDrawer extends StatelessWidget {
  const ArcadiousDrawer({super.key});

  @override
  Widget build(BuildContext context) {
    return Drawer(
      child: ListView(
        padding: EdgeInsets.zero,
        children: <Widget>[
          SizedBox(
            height: 100,
            child: DrawerHeader(
              decoration:
                  const BoxDecoration(color: Color.fromARGB(255, 10, 10, 10)),
              child: Center(
                child: Container(
                  padding: const EdgeInsets.all(0),
                  child: Image.asset('assets/arcadious_logo.png',
                      fit: BoxFit.contain),
                ),
              ),
            ),
          ),
          
          Builder(builder: (context) =>
          ListTile(
            title: const Text(
              '- HOME',
              style: TextStyle(
                fontFamily: 'Outfit',
                fontWeight: FontWeight.w700,
                color: Colors.white,
                fontSize: 22,
              ),
            ),
            onTap: () {
              final ScaffoldState scaffoldState =
                  context.findRootAncestorStateOfType<ScaffoldState>()!;
              scaffoldState.closeDrawer();

              Navigator.pushAndRemoveUntil(
                context,
                MaterialPageRoute(builder: (context) => const HomeScreen()),
                (Route<dynamic> route) => false,
              );
            },
          ),),
        ],
      ),
    );
  }
}

Header代码(用于打开Drawer)

import 'package:flutter/material.dart';

class Header extends StatelessWidget {
  const Header({super.key});

  @override
  Widget build(BuildContext context) {
    return Container(
      margin: const EdgeInsets.only(bottom: 10),
      padding: const EdgeInsets.only(bottom: 15),
      decoration: const BoxDecoration(
        border: Border(bottom: BorderSide(width: 1, color: Colors.grey, style: BorderStyle.solid))
      ),
      child: Row(
        children: <Widget>[
          Expanded(
            child: Align(
              alignment: Alignment.centerLeft,
              child: SizedBox(
                width: 23,
                height: 23,
                child: GestureDetector(
                  onTap: () {
                    final ScaffoldState scaffoldState = context.findRootAncestorStateOfType<ScaffoldState>()!;
                    scaffoldState.openDrawer();
                  },
                  child: Image.asset('assets/hamburger.png', fit: BoxFit.contain),
                ),
              ),
            ),
          ),
          Expanded(
            child: SizedBox(
              width: 25,
              height: 25,
              child: Image.asset('assets/arcadious_logo.png', fit: BoxFit.contain),
            ),
          ),
          Expanded(
            child: Align(
              alignment: Alignment.centerRight,
              child: SizedBox(
                width: 25,
                height: 25,
                child: Image.asset('assets/avatar.png', fit: BoxFit.contain),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

补充说明:该Drawer所在的页面都包含Scaffold,且根页面嵌套在MaterialApp中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 18:15:55