flutter_tree_view
flutter_tree_view copied to clipboard
Incomplete expansion state when expanding too many nodes in `AnimatedTreeView`
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)