diff --git a/packages/flutter/lib/src/rendering/sliver_group.dart b/packages/flutter/lib/src/rendering/sliver_group.dart index f10415f1b60..855136773be 100644 --- a/packages/flutter/lib/src/rendering/sliver_group.dart +++ b/packages/flutter/lib/src/rendering/sliver_group.dart @@ -246,10 +246,17 @@ class RenderSliverMainAxisGroup extends RenderSliver @override double childMainAxisPosition(RenderSliver child) { - final Offset paintOffset = (child.parentData! as SliverPhysicalParentData).paintOffset; - return switch (constraints.axis) { - Axis.horizontal => paintOffset.dx, - Axis.vertical => paintOffset.dy, + final SliverPhysicalParentData childParentData = child.parentData! as SliverPhysicalParentData; + return switch (applyGrowthDirectionToAxisDirection( + child.constraints.axisDirection, + child.constraints.growthDirection, + )) { + AxisDirection.down => childParentData.paintOffset.dy, + AxisDirection.right => childParentData.paintOffset.dx, + AxisDirection.up => + geometry!.paintExtent - child.geometry!.paintExtent - childParentData.paintOffset.dy, + AxisDirection.left => + geometry!.paintExtent - child.geometry!.paintExtent - childParentData.paintOffset.dx, }; } diff --git a/packages/flutter/test/widgets/sliver_main_axis_group_test.dart b/packages/flutter/test/widgets/sliver_main_axis_group_test.dart index 2910c130c10..85af01198e3 100644 --- a/packages/flutter/test/widgets/sliver_main_axis_group_test.dart +++ b/packages/flutter/test/widgets/sliver_main_axis_group_test.dart @@ -1063,6 +1063,34 @@ void main() { expect(tester.takeException(), isNull); }); + testWidgets('SliverMainAxisGroup reverse hitTest', (WidgetTester tester) async { + bool onTapCalled = false; + await tester.pumpWidget( + _buildSliverMainAxisGroup( + reverse: true, + viewportHeight: 70, + slivers: [ + SliverToBoxAdapter( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + onTapCalled = true; + }, + child: const SizedBox(height: 50), + ), + ), + const SliverToBoxAdapter(child: SizedBox(height: 20)), + ], + ), + ); + await tester.tapAt(const Offset(0, 10)); + await tester.pumpAndSettle(); + expect(onTapCalled, isFalse); + await tester.tapAt(const Offset(0, 69)); + await tester.pumpAndSettle(); + expect(onTapCalled, isTrue); + }); + testWidgets('SliverMainAxisGroup with center', (WidgetTester tester) async { final ScrollController controller = ScrollController(); addTearDown(controller.dispose);