Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions packages/two_dimensional_scrollables/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
## NEXT
Comment thread
tdenniston marked this conversation as resolved.
Outdated

## 0.3.4

* Updates minimum supported SDK version to Flutter 3.22/Dart 3.4.
* Fixes a bug where collapsing a node in a TreeView with other offscreen nodes would dereference a null value.

## 0.3.3

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -318,9 +318,12 @@ class RenderTreeViewport extends RenderTwoDimensionalViewport {
);
_horizontalOverflows = maxHorizontalExtent > 0.0;

final double verticalLeadingExtent = verticalOffset.pixels;
final double verticalTrailingExtent =
_rowMetrics[_lastRow!]!.trailingOffset - viewportDimension.height;
final double maxVerticalExtent = math.max(
0.0,
_rowMetrics[_lastRow!]!.trailingOffset - viewportDimension.height,
math.max(verticalLeadingExtent, verticalTrailingExtent),
);
_verticalOverflows = maxVerticalExtent > 0.0;

Expand Down
2 changes: 1 addition & 1 deletion packages/two_dimensional_scrollables/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: two_dimensional_scrollables
description: Widgets that scroll using the two dimensional scrolling foundation.
version: 0.3.3
version: 0.3.4
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+

Expand Down
90 changes: 90 additions & 0 deletions packages/two_dimensional_scrollables/test/tree_view/tree_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -886,6 +886,96 @@ void main() {
expect(find.text('tres'), findsNothing);
});
});

testWidgets('Expand then collapse with offscreen nodes (top)',
(WidgetTester tester) async {
final ScrollController verticalController = ScrollController();
final TreeViewController controller = TreeViewController();
addTearDown(verticalController.dispose);

final List<TreeViewNode<String>> tree = <TreeViewNode<String>>[
TreeViewNode<String>(
'alpha',
children: <TreeViewNode<String>>[
TreeViewNode<String>('a'),
TreeViewNode<String>('b'),
TreeViewNode<String>('c'),
],
),
TreeViewNode<String>(
'beta',
children: <TreeViewNode<String>>[
TreeViewNode<String>('d'),
TreeViewNode<String>('e'),
TreeViewNode<String>('f'),
],
),
TreeViewNode<String>(
'gamma',
children: <TreeViewNode<String>>[
TreeViewNode<String>('g'),
TreeViewNode<String>('h'),
TreeViewNode<String>('i'),
],
),
TreeViewNode<String>(
'delta',
children: <TreeViewNode<String>>[
TreeViewNode<String>('j'),
TreeViewNode<String>('k'),
TreeViewNode<String>('l'),
],
),
];

await tester.pumpWidget(MaterialApp(
home: TreeView<String>(
tree: tree,
controller: controller,
toggleAnimationStyle: AnimationStyle.noAnimation,
verticalDetails: ScrollableDetails.vertical(
controller: verticalController,
),
treeNodeBuilder: (
BuildContext context,
TreeViewNode<Object?> node,
AnimationStyle animationStyle,
) =>
GestureDetector(
onTap: () => controller.toggleNode(node),
child: TreeView.defaultTreeNodeBuilder(
context,
node,
animationStyle,
),
),
),
));

// Expand a few nodes
await tester.tap(find.text('alpha'));
await tester.tap(find.text('beta'));
await tester.tap(find.text('gamma'));
await tester.tap(find.text('delta'));
await tester.pumpAndSettle();

// Scroll down to hide some of them
expect(verticalController.position.pixels, 0.0);
const double defaultRowExtent = 40;
verticalController.jumpTo(3 * defaultRowExtent + 10);
await tester.pump();
expect(find.text('alpha'), findsNothing);

// Collapse the bottommost node
expect(find.text('j'), findsOneWidget);
expect(find.text('k'), findsOneWidget);
expect(find.text('l'), findsOneWidget);
await tester.tap(find.text('delta'));
await tester.pumpAndSettle();
expect(find.text('j'), findsNothing);
expect(find.text('k'), findsNothing);
expect(find.text('l'), findsNothing);
});
});

group('TreeViewport', () {
Expand Down