Flutter单位树形结构管理插件unit_tree_flutter的使用

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

Flutter单位树形结构管理插件unit_tree_flutter的使用

目录

演示

默认情况下,您可以应用此包的8种基本变体:Stack/Expanded部件 x 多选/单选 x 预加载/懒加载

1. Stack部件

  • 1.1. <code>MStackWidget</code>:多选,预加载。
  • 1.2. <code>MLazyStackWidget</code>:多选,懒加载。
  • 1.3. <code>SStackWidget</code>:单选,预加载。
  • 1.4. <code>SLazyStackWidget</code>:单选,懒加载。

MStackWidget MLazyStackWidget

SStackWidget SLazyStackWidget

2. Expanded部件

  • 2.1. <code>MExpandedWidget</code>:多选,预加载。
  • 2.2. <code>MLazyExpandedWidget</code>:多选,懒加载。
  • 2.3. <code>SExpandedWidget</code>:单选,预加载。
  • 2.4. <code>SLazyExpandedWidget</code>:单选,懒加载。

MExpandedWidget MLazyExpandedWidget

SExpandedWidget SLazyExpandedWidget

快速开始

1. 引入树形数据结构

树形数据结构与算法来自此包:unit_tree_data_structure

属性isUnavailable默认定义为:如果一个分支不包含任何叶子,则该分支不可用(或不可选择)。

TreeType<EasyNodeType> sampleData() {
  Map<String, dynamic> data = {
    "data": {
      "id": 0,
      "title": "Root: Level 0",
    },
    "children": [
      {
        "data": {
          "id": 11,
          "title": "(Inner) Ex title: Level 1.1",
        },
        "children": [
          {
            "data": {
              "id": 21,
              "title": "(Inner) Ex title: Level 2.1",
            },
            "children": [
              {
                "data": {
                  "id": 31,
                  "title": "(Leaf) Ex title: Level 3.1",
                  "isInner": false,
                },
              },
              {
                "data": {
                  "id": 32,
                  "title": "(Leaf) Ex title: Level 3.2",
                  "isInner": false,
                },
              },
              {
                "data": {
                  "id": 33,
                  "title": "(Leaf) Ex title: Level 3.3",
                  "isInner": false,
                },
              },
            ],
          },
          {
            "data": {
              "id": 22,
              "title": "(Inner) Ex title: Level 2.2",
            },
            "children": [
              {
                "data": {
                  "id": 34,
                  "title": "(Leaf) Ex title: Level 3.4",
                  "isInner": false,
                },
              },
            ],
          },
          {
            "data": {
              "id": 23,
              "title": "(Inner) Ex title: Level 2.3",
            },
          },
        ],
      },
      {
        "data": {
          "id": 12,
          "title": "(Inner) Ex title: Level 1.2",
        },
      },
    ],
  };

  var tree = TreeType.fromJson<EasyNodeType>(
    json: data,
    parent: null,
    implFromJson: EasyNodeType.fromJson,
  );

  // 调用此函数非常重要
  updateAllUnavailableNodes(tree);

  return tree;
}

然后,将这些数据放入您的部件:

initData = sampleData();

return MExpandedWidget(initData); // 或
return SExpandedWidget(initData); // 或
return MStackWidget([initData]); // 或
return SStackWidget([initData]);

3. 使用懒加载样式

懒加载部件接收一个Future函数,在每次点击时获取子节点:

Future<List<TreeType<T>>> Function(TreeType<T> parent) fGetChildrenFunc;

您可以在以下源代码中阅读示例: MLazyExpandedScreen

root = createRoot();

Future<List<TreeType<EasyNodeType>>> fGetChildrenFunc(
    TreeType<EasyNodeType> parent) async {
  List<TreeType<EasyNodeType>> newChildren;
  setState(() => isLoading = true);
  
  newChildren = implementationXYZ(parent);

  await Future.delayed(const Duration(seconds: 1));
  setState(() => isLoading = false);
  return newChildren;
}

return MLazyExpandedWidget(
  root,
  fGetChildrenFunc: fGetChildrenFunc,
); // 或

return SLazyExpandedWidget(
  root,
  fGetChildrenFunc: fGetChildrenFunc,
); // 或

return MLazyStackWidget
  [root],
  fGetChildrenFunc: fGetChildrenFunc,
); // 或

return SLazyStackWidget(
  [root],
  fGetChildrenFunc: fGetChildrenFunc,
);

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

1 回复

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


当然,以下是一个关于如何使用 unit_tree_flutter 插件来管理单位树形结构的示例代码。假设 unit_tree_flutter 插件提供了一个基本的树形结构管理功能,我们可以基于常见的树形结构组件来演示。

首先,你需要在你的 pubspec.yaml 文件中添加 unit_tree_flutter 依赖:

dependencies:
  flutter:
    sdk: flutter
  unit_tree_flutter: ^最新版本号

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

接下来,我们可以编写一个简单的示例来展示如何使用这个插件。假设 unit_tree_flutter 提供了一个 UnitTree 组件,我们可以这样使用它:

import 'package:flutter/material.dart';
import 'package:unit_tree_flutter/unit_tree_flutter.dart'; // 假设插件的导入路径是这样的

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Unit Tree Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: UnitTreePage(),
    );
  }
}

class UnitTreePage extends StatefulWidget {
  @override
  _UnitTreePageState createState() => _UnitTreePageState();
}

class _UnitTreePageState extends State<UnitTreePage> {
  // 示例树形结构数据
  List<UnitNode> treeData = [
    UnitNode(
      id: 1,
      title: 'Unit 1',
      children: [
        UnitNode(
          id: 2,
          title: 'Unit 1.1',
          children: [
            UnitNode(id: 3, title: 'Unit 1.1.1'),
            UnitNode(id: 4, title: 'Unit 1.1.2'),
          ],
        ),
        UnitNode(id: 5, title: 'Unit 1.2'),
      ],
    ),
    UnitNode(
      id: 6,
      title: 'Unit 2',
      children: [
        UnitNode(id: 7, title: 'Unit 2.1'),
      ],
    ),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Unit Tree Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: UnitTree(
          nodes: treeData,
          onNodeTap: (UnitNode node) {
            // 处理节点点击事件
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(
                content: Text('Tapped on ${node.title}'),
              ),
            );
          },
        ),
      ),
    );
  }
}

// 假设 UnitNode 是插件提供的数据结构类
class UnitNode {
  final int id;
  final String title;
  final List<UnitNode>? children;

  UnitNode({required this.id, required this.title, this.children});
}

在这个示例中,我们做了以下几件事:

  1. 定义数据结构:我们定义了一个 UnitNode 类来表示树形结构中的每个节点。这个类包含节点的 idtitle 和子节点列表。

  2. 创建示例数据:我们创建了一些示例数据来表示树形结构。

  3. 构建 UI:我们使用 ScaffoldUnitTree 组件来构建 UI。UnitTree 组件接收节点列表和一个节点点击事件的处理函数。

  4. 处理节点点击事件:当用户点击某个节点时,我们显示一个 SnackBar 来反馈点击的节点标题。

请注意,由于 unit_tree_flutter 插件的具体实现和 API 可能有所不同,上述代码中的 UnitTree 组件和 UnitNode 类是假设的。你需要根据实际的插件文档和 API 来调整代码。如果插件提供了其他功能(如添加、删除节点等),你也可以根据文档进行相应的扩展。

回到顶部