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

使用easy_sidemenu包,退出后返回仪表盘侧边菜单不显示问题求助

问题解决方法

1. 清理Controller资源,避免状态残留

在State类中添加dispose方法,释放controller资源,防止内存泄漏和状态混乱:

@override
void dispose() {
  // 移除监听
  sideMenu.removeListener(_onPageChanged);
  // 释放controller
  sideMenu.dispose();
  page.dispose();
  super.dispose();
}

// 把监听逻辑抽成独立方法,方便移除
void _onPageChanged(int pageIndex) {
  page.jumpToPage(pageIndex);
}

同时修改initState中的监听代码:

@override
void initState() {
  sideMenu.addListener(_onPageChanged);
  super.initState();
}

2. 明确设置SideMenu宽度

为SideMenu组件添加固定宽度,避免布局计算异常导致侧边栏被挤压消失:

SideMenu(
  width: 220, // 添加固定宽度
  controller: sideMenu,
  items: [
    // ... 原有菜单项
  ],
)

3. 确保PageView有内容(可选)

空PageView可能影响Row布局稳定性,建议添加对应菜单项的页面组件:

Expanded(
  child: PageView(
    controller: page,
    children: [
      Center(child: Text('Dashboard Page')),
      Center(child: Text('Users Page')),
      SizedBox(), // 对应Logout项,无需页面内容
    ],
  ),
)

完整修改后的代码示例

class DashboardPage extends StatefulWidget {
  final String title;
  const DashboardPage({super.key, required this.title});

  @override
  State<DashboardPage> createState() => _DashboardPageState();
}

class _DashboardPageState extends State<DashboardPage> {
  PageController page = PageController();
  SideMenuController sideMenu = SideMenuController();

  @override
  void initState() {
    sideMenu.addListener(_onPageChanged);
    super.initState();
  }

  void _onPageChanged(int pageIndex) {
    page.jumpToPage(pageIndex);
  }

  @override
  void dispose() {
    sideMenu.removeListener(_onPageChanged);
    sideMenu.dispose();
    page.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        centerTitle: true,
      ),
      body: Row(
        mainAxisAlignment: MainAxisAlignment.start,
        children: [
          SideMenu(
            width: 220,
            controller: sideMenu,
            items: [
              SideMenuItem(
                priority: 0,
                title: 'Dashboard',
                onTap: (page, _) {
                  sideMenu.changePage(page);
                },
                icon: const Icon(Icons.home),
                badgeContent: const Text(
                  '3',
                  style: TextStyle(color: Colors.white),
                ),
                tooltipContent: "This is a tooltip for Dashboard item",
              ),
              SideMenuItem(
                priority: 1,
                title: 'Users',
                onTap: (page, _) {
                  sideMenu.changePage(page);
                },
                icon: const Icon(Icons.supervisor_account),
              ),
              SideMenuItem(
                priority: 2,
                title: 'Logout',
                onTap: (page, _) {
                  Navigator.pushAndRemoveUntil(
                      context,
                      MaterialPageRoute(
                          builder: ((context) =>
                              const Register(screen: false))),
                      (route) => false);
                },
                icon: Icon(Icons.exit_to_app),
              ),
            ],
          ),
          Expanded(
            child: PageView(
              controller: page,
              children: [
                Center(child: Text('Dashboard Content')),
                Center(child: Text('Users Management')),
                SizedBox(),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

问题原因分析

  • 未正确释放controller资源,再次进入页面时残留状态干扰组件渲染
  • SideMenu未设置固定宽度,页面重建时布局计算异常,侧边栏被挤压至不可见
  • 空PageView可能加剧布局不稳定问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 03:45:31