将嵌套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
相关产品推荐
相关产品推荐

