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

如何使用Flutter实现可展开列表树?求推荐相关插件

Flutter 可展开列表树实现方案

原生实现(无依赖)

如果不想引入第三方包,用Flutter自带的ExpansionTile配合递归组件就能搞定:

1. 定义树形数据结构

先搞一个简单的节点类,用来存标题和子节点:

class TreeNode {
  final String title;
  final List<TreeNode>? children;

  TreeNode({required this.title, this.children});
}

2. 递归构建树形列表

写一个递归方法,根据节点是否有子节点来渲染ExpansionTile或者普通ListTile,子节点可以加个缩进区分层级:

Widget buildTree(List<TreeNode> nodes) {
  return ListView.builder(
    shrinkWrap: true,
    itemCount: nodes.length,
    itemBuilder: (context, index) {
      final node = nodes[index];
      if (node.children != null && node.children!.isNotEmpty) {
        return ExpansionTile(
          title: Text(node.title),
          children: node.children!.map((child) {
            return Padding(
              padding: const EdgeInsets.only(left: 24),
              child: buildTree([child]),
            );
          }).toList(),
        );
      } else {
        return ListTile(title: Text(node.title));
      }
    },
  );
}

3. 使用示例

准备好树形数据,直接调用上面的方法就行:

final sampleTree = [
  TreeNode(
    title: "文件夹A",
    children: [
      TreeNode(title: "文档1.txt"),
      TreeNode(
        title: "子文件夹A1",
        children: [TreeNode(title: "图片1.png")],
      ),
    ],
  ),
  TreeNode(title: "文件夹B"),
];

// 在页面里直接用
@override
Widget build(BuildContext context) {
  return Scaffold(
    body: buildTree(sampleTree),
  );
}

第三方包推荐

如果需要更复杂的功能(比如多选、拖拽排序、自定义动画),这些包可以省不少事:

  • flutter_tree_view:轻量灵活,支持自定义节点样式、展开/折叠动画,还能管理节点选中状态,API很友好。
  • expandable:不止树形结构,各种可展开布局都能搞,提供多种过渡动画,适合需要定制动效的场景。
  • tree_view:功能很全,支持拖拽排序、节点编辑、多选模式,适合复杂的树形需求项目。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:02:02