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

将嵌套MenuModel列表转为Flutter嵌套组件的算法实现求助

解决方案

可以通过递归函数处理嵌套的MenuModel列表,自动生成对应的ExpansionTile和ListTile结构,核心逻辑是根据每个MenuModel的属性判断生成展开项还是普通选项:

1. 递归构建菜单组件的函数

创建一个返回List<Widget>的递归函数,遍历每个MenuModel并生成对应组件:

List<Widget> buildMenuItems(List<MenuModel> menuItems) {
  List<Widget> items = [];
  for (var item in menuItems) {
    // 有子菜单时生成ExpansionTile
    if (item.menues != null && item.menues!.isNotEmpty) {
      items.add(
        ExpansionTile(
          title: Text(item.title),
          children: buildMenuItems(item.menues!),
        ),
      );
    } else {
      // 无菜单但有路由时生成可跳转的ListTile
      items.add(
        ListTile(
          title: Text(item.title),
          onTap: item.route != null
              ? () => Navigator.pushNamed(context, item.route!)
              : null,
        ),
      );
    }
  }
  return items;
}

2. 在页面中调用函数

将递归生成的组件放入ListView或Drawer等容器中即可使用:

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: const Text('Nested Menu')),
    drawer: Drawer(
      child: ListView(
        padding: EdgeInsets.zero,
        children: [
          const DrawerHeader(
            decoration: BoxDecoration(color: Colors.blue),
            child: Text('Menu'),
          ),
          ...buildMenuItems(menu),
        ],
      ),
    ),
    body: const Center(child: Text('Home Page')),
  );
}

3. 额外说明

  • 若MenuModel既无路由也无子菜单,会生成不可点击的ListTile,可根据需求添加隐藏或提示逻辑
  • 递归逻辑支持任意层级的嵌套子菜单,无需修改代码即可适配三级、四级等更深层级

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:40:29