diff --git a/packages/two_dimensional_scrollables/CHANGELOG.md b/packages/two_dimensional_scrollables/CHANGELOG.md index 7aae2c8f5377..31ecdfdcdb66 100644 --- a/packages/two_dimensional_scrollables/CHANGELOG.md +++ b/packages/two_dimensional_scrollables/CHANGELOG.md @@ -1,4 +1,6 @@ -## NEXT +## 0.3.3 + +* Fixes an issue where collapsing nodes in the TreeView didn't work correctly. ## 0.3.2 diff --git a/packages/two_dimensional_scrollables/lib/src/tree_view/tree.dart b/packages/two_dimensional_scrollables/lib/src/tree_view/tree.dart index a3ba1bd218fe..f9fc6c82e7eb 100644 --- a/packages/two_dimensional_scrollables/lib/src/tree_view/tree.dart +++ b/packages/two_dimensional_scrollables/lib/src/tree_view/tree.dart @@ -911,6 +911,12 @@ class _TreeViewState extends State> _currentAnimationForParent[node]!.controller.dispose(); _currentAnimationForParent.remove(node); _updateActiveAnimations(); + // If the node is collapsing, we need to unpack the active + // nodes to remove the ones that were removed from the tree. + // This is only necessary if the node is collapsing. + if (!node._expanded) { + _unpackActiveNodes(); + } case AnimationStatus.forward: case AnimationStatus.reverse: } @@ -949,9 +955,7 @@ class _TreeViewState extends State> controller.forward(); case false: // Collapsing - controller.reverse().then((_) { - _unpackActiveNodes(); - }); + controller.reverse(); } }); } diff --git a/packages/two_dimensional_scrollables/pubspec.yaml b/packages/two_dimensional_scrollables/pubspec.yaml index b2ab81b0ae13..3cd575a8c76a 100644 --- a/packages/two_dimensional_scrollables/pubspec.yaml +++ b/packages/two_dimensional_scrollables/pubspec.yaml @@ -1,6 +1,6 @@ name: two_dimensional_scrollables description: Widgets that scroll using the two dimensional scrolling foundation. -version: 0.3.2 +version: 0.3.3 repository: https://github.com/flutter/packages/tree/main/packages/two_dimensional_scrollables issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+two_dimensional_scrollables%22+ diff --git a/packages/two_dimensional_scrollables/test/tree_view/tree_test.dart b/packages/two_dimensional_scrollables/test/tree_view/tree_test.dart index 6177ce33707b..5e536402b85a 100644 --- a/packages/two_dimensional_scrollables/test/tree_view/tree_test.dart +++ b/packages/two_dimensional_scrollables/test/tree_view/tree_test.dart @@ -814,6 +814,74 @@ void main() { expect(find.text('dos'), findsNothing); expect(find.text('tres'), findsNothing); }); + + testWidgets( + 'TreeViewNode should close all child nodes when collapsed, once the animation is completed', + (WidgetTester tester) async { + final TreeViewController controller = TreeViewController(); + final List> tree = >[ + TreeViewNode( + 'First', + expanded: true, + children: >[ + TreeViewNode( + 'alpha', + expanded: true, + children: >[ + TreeViewNode('uno'), + TreeViewNode('dos'), + TreeViewNode('tres'), + ], + ), + TreeViewNode('beta'), + TreeViewNode('kappa'), + ], + ), + ]; + + await tester.pumpWidget(MaterialApp( + home: TreeView( + tree: tree, + controller: controller, + toggleAnimationStyle: AnimationStyle( + curve: Curves.easeInOut, + duration: const Duration(milliseconds: 200), + ), + treeNodeBuilder: ( + BuildContext context, + TreeViewNode node, + AnimationStyle animationStyle, + ) { + final Widget child = GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () => controller.toggleNode(node), + child: TreeView.defaultTreeNodeBuilder( + context, + node, + animationStyle, + ), + ); + + return child; + }, + ), + )); + + expect(find.text('alpha'), findsOneWidget); + expect(find.text('uno'), findsOneWidget); + expect(find.text('dos'), findsOneWidget); + expect(find.text('tres'), findsOneWidget); + + // Using runAsync to handle collapse and animations properly. + await tester.runAsync(() async { + await tester.tap(find.text('alpha')); + await tester.pumpAndSettle(); + + expect(find.text('uno'), findsNothing); + expect(find.text('dos'), findsNothing); + expect(find.text('tres'), findsNothing); + }); + }); }); group('TreeViewport', () {