prevent pageView scrolling when calling ensureVisible (#67988)
diff --git a/packages/flutter/lib/src/widgets/page_view.dart b/packages/flutter/lib/src/widgets/page_view.dart
index e67195e..aa7ad9e 100644
--- a/packages/flutter/lib/src/widgets/page_view.dart
+++ b/packages/flutter/lib/src/widgets/page_view.dart
@@ -341,17 +341,9 @@
RenderObject? targetRenderObject,
}) {
// Since the _PagePosition is intended to cover the available space within
- // its viewport, stop trying to move the target render object to the center
- // - otherwise, could end up changing which page is visible and moving the
- // targetRenderObject out of the viewport.
- return super.ensureVisible(
- object,
- alignment: alignment,
- duration: duration,
- curve: curve,
- alignmentPolicy: alignmentPolicy,
- targetRenderObject: null,
- );
+ // its viewport, stop trying to any scroll, otherwise, could end up changing
+ // which page is visible and moving the render object out of the viewport.
+ return Future<void>.value();
}
@override
diff --git a/packages/flutter/test/widgets/scrollable_test.dart b/packages/flutter/test/widgets/scrollable_test.dart
index 6e48059..f162e8b 100644
--- a/packages/flutter/test/widgets/scrollable_test.dart
+++ b/packages/flutter/test/widgets/scrollable_test.dart
@@ -1006,6 +1006,76 @@
expect(targetMidRightPage1, findsOneWidget);
expect(targetMidLeftPage1, findsOneWidget);
});
+
+ testWidgets('ensureVisible does not move PageViews when there are objects between pageView and target object', (WidgetTester tester) async {
+ final PageController controller = PageController();
+ int count = 0;
+
+ await tester.pumpWidget(
+ Directionality(
+ textDirection: TextDirection.ltr,
+ child: PageView(
+ controller: controller,
+ children: List<Widget>.generate(3, (int index) {
+ return Row(
+ children: <Widget>[
+ Container(
+ width: 400,
+ color: Colors.red,
+ ),
+ Expanded(
+ child: Container(
+ color: Colors.green,
+ width: double.infinity,
+ height: 50,
+ child: SingleChildScrollView(
+ scrollDirection: Axis.horizontal,
+ child: Container(
+ key: Key(index.toString()),
+ color: Colors.yellow,
+ height: 50,
+ width: 200,
+ ),
+ ),
+ ),
+ )
+ ],
+ );
+ }),
+ ),
+ ),
+ );
+
+ controller.position.addListener(() {
+ count++;
+ });
+
+ final Finder targetOfPage0 = find.byKey(const Key('0'));
+ final Finder targetOfPage1 = find.byKey(const Key('1'));
+
+ expect(targetOfPage0, findsOneWidget);
+ expect(targetOfPage1, findsNothing);
+
+ // `ensureVisible` should not trigger any scrolling or page changing of pageView.
+ await tester.ensureVisible(targetOfPage0);
+ await tester.pumpAndSettle();
+ expect(count, 0);
+ expect(targetOfPage0, findsOneWidget);
+ expect(targetOfPage1, findsNothing);
+
+ controller.jumpToPage(1);
+ await tester.pumpAndSettle();
+
+ expect(count, 1); // Trigger by `controller.jumpToPage(1)`
+ expect(targetOfPage0, findsNothing);
+ expect(targetOfPage1, findsOneWidget);
+
+ await tester.ensureVisible(targetOfPage1);
+ await tester.pumpAndSettle();
+ expect(count, 1);
+ expect(targetOfPage0, findsNothing);
+ expect(targetOfPage1, findsOneWidget);
+ });
}
// ignore: must_be_immutable