Flutter列表转树形结构插件list_to_tree的使用

发布于 1周前 作者 bupafengyu 来自 Flutter

Flutter列表转树形结构插件list_to_tree的使用

简介

list_to_tree 是一个用于将线性数组转换为树形结构的Dart包。

安装

要使用此插件,在您的 pubspec.yaml 文件中添加 list_to_tree 作为依赖项。

dependencies:
  list_to_tree: ^x.x.x

然后运行 flutter pub get 来安装该包。

使用方法

示例

以下是一个简单的示例,演示如何使用 list_to_tree 将一个线性数组转换为树形结构。

import 'dart:convert';

// 导入 list_to_tree 包
import 'package:list_to_tree/list_to_tree.dart';

// 定义一个基础实体类
class BaseEntity {
  final int id;
  final int? parentId;
  final List<BaseEntity> children;

  const BaseEntity({
    required this.id,
    required this.parentId,
    required this.children,
  });

  // 获取属性列表
  List<Object?> get props => [id, parentId, children];

  // 转换为JSON格式
  Map<String, dynamic> toJson() => {
        'id': id,
        'parentId': parentId,
        'children': children.map((e) => e.toJson()).toList(),
      };

  // 字符串表示
  @override
  String toString() {
    return JsonEncoder.withIndent('  ').convert(toJson());
  }

  // 创建空数组实例
  Object withArray() => BaseEntity(
        id: id,
        parentId: parentId,
        children: [],
      );
}

// 定义一个测试类继承自BaseEntity
class TestClass extends BaseEntity {
  final String title;

  const TestClass({
    required int id,
    required int? parentId,
    required List<TestClass> children,
    required this.title,
  }) : super(id: id, parentId: parentId, children: children);

  // 获取属性列表
  @override
  List<Object?> get props => [id, parentId, children, title];

  // 转换为JSON格式
  Map<String, dynamic> get toJson => {
        'id': id,
        'parentId': parentId,
        'title': title,
        'children': (children as List<TestClass>).map((e) => e.toJson).toList(),
      };

  // 字符串表示
  @override
  String toString() => JsonEncoder.withIndent('  ').convert(toJson);

  // 创建空数组实例
  @override
  Object withArray() => TestClass(
        id: id,
        parentId: parentId,
        children: [],
        title: title,
      );
}

void main() {
  // 初始化数据列表
  final items = [
    TestClass(id: 1, parentId: null, children: [], title: 'title1'),
    TestClass(id: 2, parentId: null, children: [], title: 'title2'),
    TestClass(id: 3, parentId: 1, children: [], title: 'title3'),
    TestClass(id: 4, parentId: 1, children: [], title: 'title4'),
    TestClass(id: 5, parentId: 2, children: [], title: 'title5'),
    TestClass(id: 6, parentId: 2, children: [], title: 'title6'),
    TestClass(id: 7, parentId: 3, children: [], title: 'title7'),
  ];

  // 打印原始数据
  print('原始数据:');
  print(items);

  // 将线性数组转换为树形结构
  final treeResult = ArrayToTree.instance.toTree(items);

  // 打印树形结构结果
  print('树形结构结果:');
  print(treeResult);
}

输出示例

原始数据:
[
  TestClass(
    id: 1,
    parentId: null,
    children: [
      TestClass(
        id: 3,
        parentId: 1,
        children: [
          TestClass(id: 7, parentId: 3, children: [], title: 'title7'),
        ],
        title: 'title3',
      ),
      TestClass(id: 4, parentId: 1, children: [], title: 'title4'),
    ],
    title: 'title1',
  ),
  TestClass(
    id: 2,
    parentId: null,
    children: [
      TestClass(id: 5, parentId: 2, children: [], title: 'title5'),
      TestClass(id: 6, parentId: 2, children: [], title: 'title6'),
    ],
    title: 'title2',
  )
]
树形结构结果:
[
  TestClass(
    id: 1,
    parentId: null,
    children: [
      TestClass(
        id: 3,
        parentId: 1,
        children: [
          TestClass(id: 7, parentId: 3, children: [], title: 'title7'),
        ],
        title: 'title3',
      ),
      TestClass(id: 4, parentId: 1, children: [], title: 'title4'),
    ],
    title: 'title1',
  ),
  TestClass(
    id: 2,
    parentId: null,
    children: [
      TestClass(id: 5, parentId: 2, children: [], title: 'title5'),
      TestClass(id: 6, parentId: 2, children: [], title: 'title6'),
    ],
    title: 'title2',
  )
]

更多关于Flutter列表转树形结构插件list_to_tree的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter列表转树形结构插件list_to_tree的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 list_to_tree 插件将Flutter中的列表转换为树形结构的代码示例。这个插件可以帮助你将一个扁平的列表数据结构转换为一个嵌套的树形结构,非常适合用于展示分层数据,比如文件系统、组织架构等。

首先,确保你已经在 pubspec.yaml 文件中添加了 list_to_tree 依赖:

dependencies:
  flutter:
    sdk: flutter
  list_to_tree: ^x.y.z  # 请替换为最新版本号

然后,运行 flutter pub get 来获取依赖。

接下来,假设我们有一个简单的扁平列表数据,每个元素包含一个唯一的 id 和一个 parentId,用于表示层级关系:

import 'package:flutter/material.dart';
import 'package:list_to_tree/list_to_tree.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('List to Tree Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(8.0),
          child: TreeExample(),
        ),
      ),
    );
  }
}

class TreeNodeData {
  String id;
  String parentId;
  String name;

  TreeNodeData({required this.id, required this.parentId, required this.name});
}

class TreeExample extends StatelessWidget {
  List<TreeNodeData> getFlatList() {
    return [
      TreeNodeData(id: '1', parentId: null, name: 'Root'),
      TreeNodeData(id: '2', parentId: '1', name: 'Child 1'),
      TreeNodeData(id: '3', parentId: '1', name: 'Child 2'),
      TreeNodeData(id: '4', parentId: '2', name: 'Grandchild 1'),
      TreeNodeData(id: '5', parentId: '2', name: 'Grandchild 2'),
    ];
  }

  @override
  Widget build(BuildContext context) {
    List<TreeNodeData> flatList = getFlatList();
    List<TreeNode<TreeNodeData>> tree = ListToTree<TreeNodeData>().parse(
      flatList,
      getFieldId: (item) => item.id,
      getFieldParentId: (item) => item.parentId,
      childrenFieldName: 'children',
    );

    return ListView.builder(
      itemCount: tree.length,
      itemBuilder: (context, index) {
        return TreeNodeWidget(node: tree[index]);
      },
    );
  }
}

class TreeNodeWidget extends StatelessWidget {
  final TreeNode<TreeNodeData> node;

  TreeNodeWidget({required this.node});

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.symmetric(vertical: 4.0, horizontal: 8.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          Text(
            node.data.name,
            style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
          ),
          if (node.children.isNotEmpty)
            Padding(
              padding: const EdgeInsets.only(left: 16.0),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: node.children.map((child) => TreeNodeWidget(node: child)).toList(),
              ),
            ),
        ],
      ),
    );
  }
}

在这个示例中:

  1. 我们定义了一个 TreeNodeData 类来表示列表中的每个节点。
  2. TreeExample 类中获取了一个扁平的列表数据,并使用 ListToTree<TreeNodeData>().parse 方法将其转换为树形结构。
  3. TreeNodeWidget 类是一个递归组件,用于渲染树中的每个节点及其子节点。

通过这种方式,你可以轻松地将扁平的列表数据转换为树形结构,并在Flutter应用中展示。

回到顶部