Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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: 2 additions & 1 deletion packages/two_dimensional_scrollables/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
## NEXT
## 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
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