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
1 change: 1 addition & 0 deletions packages/two_dimensional_scrollables/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
## NEXT

* Updates minimum supported SDK version to Flutter 3.38/Dart 3.10.
* Fixes hit testing for `TreeView` row content after horizontal scrolling.

## 0.5.2

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ class RenderTreeViewport extends RenderTwoDimensionalViewport {
row = childAfter(row);
continue;
}
final Rect rowRect = parentData.paintOffset! & Size(viewportDimension.width, row.size.height);
final Rect rowRect = parentData.paintOffset! & row.size;
if (rowRect.contains(position)) {
result.addWithPaintOffset(
offset: parentData.paintOffset,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,57 @@ void main() {
expect(log, <String>['First', 'Second', 'Third']);
});

testWidgets('row children remain hittable after horizontal scrolling', (
WidgetTester tester,
) async {
final horizontalController = ScrollController();
addTearDown(horizontalController.dispose);
final tappedSegments = <String>[];

await tester.pumpWidget(
MaterialApp(
home: Align(
alignment: Alignment.topLeft,
child: SizedBox(
width: 200,
height: 40,
child: TreeView<int>(
tree: <TreeViewNode<int>>[TreeViewNode<int>(0)],
horizontalDetails: ScrollableDetails.horizontal(controller: horizontalController),
indentation: TreeViewIndentationType.none,
treeNodeBuilder: (_, _, _) {
return Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () => tappedSegments.add('leading'),
child: const SizedBox(width: 200, height: 40),
),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () => tappedSegments.add('trailing'),
child: const SizedBox(width: 50, height: 40),
),
],
);
},
treeRowBuilder: (_) => const TreeRow(extent: FixedTreeRowExtent(40)),
),
),
),
),
);
await tester.pump();

horizontalController.jumpTo(50);
await tester.pump();
await tester.tapAt(const Offset(175, 20));
await tester.pump();

expect(tappedSegments, <String>['trailing']);
});

testWidgets('mouse handling', (WidgetTester tester) async {
var enterCounter = 0;
var exitCounter = 0;
Expand Down