flutter_tree_view icon indicating copy to clipboard operation
flutter_tree_view copied to clipboard

Incomplete expansion state when expanding too many nodes in `AnimatedTreeView`

Open TENX-S opened this issue 5 months ago • 3 comments

https://github.com/baumths/flutter_tree_view/assets/40336192/8fb96bc3-18ca-4275-a1c7-b332b5683206

I tweaked examples/minimal.dart a little bit to get minimal reproducible code:

import 'package:flutter/material.dart';
import 'package:flutter_fancy_tree_view/flutter_fancy_tree_view.dart';
import 'package:uuid/uuid.dart';

class Node {
  Node({
    required this.title,
    Iterable<Node>? children,
  }) : children = <Node>[...?children];

  final String title;
  final List<Node> children;
}

class MinimalTreeView extends StatefulWidget {
  const MinimalTreeView({super.key});

  @override
  State<MinimalTreeView> createState() => _MinimalTreeViewState();
}

class _MinimalTreeViewState extends State<MinimalTreeView> {
  late final TreeController<Node> treeController;

  @override
  void initState() {
    super.initState();

    treeController = TreeController<Node>(
      roots: getRoots(),
      childrenProvider: (Node node) => node.children,
    );
  }

  @override
  void dispose() {
    treeController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Builder(builder: (context) {
          return ElevatedButton(
            onPressed: () {
              (treeController.isTreeExpanded
                  ? treeController.collapseAll
                  : treeController.expandAll)();
              setState(() {});
            },
            child: Text(
                treeController.isTreeExpanded ? 'collapse all' : 'expand all'),
          );
        }),
        Expanded(
          child: AnimatedTreeView<Node>(
            treeController: treeController,
            shrinkWrap: true,
            duration: const Duration(milliseconds: 100),
            curve: Curves.easeInOutQuint,
            physics: const ClampingScrollPhysics(),
            maxNodesToShowWhenAnimating: 200,
            nodeBuilder: (BuildContext context, TreeEntry<Node> entry) {
              return TreeIndentation(
                entry: entry,
                child: Row(
                  children: [
                    ExpandIcon(
                      key: GlobalObjectKey(entry.node),
                      isExpanded: entry.isExpanded,
                      onPressed: (_) =>
                          treeController.toggleExpansion(entry.node),
                    ),
                    Flexible(
                      child: Text(entry.node.title),
                    ),
                  ],
                ),
              );
            },
          ),
        ),
      ],
    );
  }
}

final roots = [];

const _uuid = Uuid();

List<Node> getRoots() {
  var title = _uuid.v4;
  return List.generate(
      50,
      (index) => Node(
            title: title(),
            children: [
              Node(
                title: title(),
                children: List.generate(4, (index) => Node(title: title())),
              ),
              Node(
                title: title(),
                children: List.generate(4, (index) => Node(title: title())),
              ),
            ],
          ));
}

TreeView does not have this problem even if you generate 5000 nodes in getRoots() (but expand all nodes will freeze the app)

TENX-S avatar Jan 15 '24 02:01 TENX-S