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

Flutter如何实现未知层级的嵌套Expansion Tile(分类与子分类)

实现未知层级嵌套的ExpansionTile/ListTile列表

首先定义分类数据模型,用来匹配你的数据结构:

class Category {
  final String name;
  final List<Category>? subCategories;

  Category({required this.name, this.subCategories});
}

核心思路是用递归组件处理未知层级的分类,根据当前分类是否包含子分类,自动切换渲染ListTile或ExpansionTile:

Widget _buildCategoryItem(Category category) {
  // 无任何子分类时,渲染普通ListTile
  if (category.subCategories == null || category.subCategories!.isEmpty) {
    return ListTile(
      title: Text(category.name),
      onTap: () {
        // 这里添加普通分类的点击逻辑
        print('选中分类:${category.name}');
      },
    );
  }

  // 存在子分类时,渲染嵌套的ExpansionTile
  return ExpansionTile(
    title: Text(category.name),
    // 递归处理每个子分类,自动适配深层级结构
    children: category.subCategories!.map(_buildCategoryItem).toList(),
    onExpansionChanged: (isExpanded) {
      // 可选:添加展开/收起的回调逻辑
      print('${category.name} ${isExpanded ? '已展开' : '已收起'}');
    },
  );
}

最后在页面中直接使用这个递归函数,传入根分类列表即可:

class CategoryListPage extends StatelessWidget {
  // 模拟的未知层级分类数据
  final List<Category> categoryData = [
    Category(
      name: '电子产品',
      subCategories: [
        Category(name: '手机'),
        Category(
          name: '电脑',
          subCategories: [
            Category(name: '笔记本'),
            Category(
              name: '台式机',
              subCategories: [
                Category(name: '组装机'),
                Category(name: '品牌机'),
              ],
            ),
          ],
        ),
      ],
    ),
    Category(name: '服饰'),
    Category(
      name: '家居',
      subCategories: [
        Category(name: '家具'),
        Category(name: '家纺'),
      ],
    ),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('分类列表')),
      body: ListView(
        children: categoryData.map(_buildCategoryItem).toList(),
      ),
    );
  }

  // 上面的递归函数放在这里
  Widget _buildCategoryItem(Category category) {
    if (category.subCategories == null || category.subCategories!.isEmpty) {
      return ListTile(
        title: Text(category.name),
        onTap: () {
          print('选中分类:${category.name}');
        },
      );
    }

    return ExpansionTile(
      title: Text(category.name),
      children: category.subCategories!.map(_buildCategoryItem).toList(),
      onExpansionChanged: (isExpanded) {
        print('${category.name} ${isExpanded ? '已展开' : '已收起'}');
      },
    );
  }
}

关键说明

  • 递归调用_buildCategoryItem处理每个子分类,不管层级多深都能自动适配
  • 通过判断subCategories是否为空,动态切换渲染组件类型
  • 可以根据需求自定义ListTile和ExpansionTile的样式、点击事件等逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:46:59