prevent pageView scrolling when calling ensureVisible (#67988)
This commit is contained in:
parent
625ffcaaa6
commit
62cf4dbf10
@ -341,17 +341,9 @@ class _PagePosition extends ScrollPositionWithSingleContext implements PageMetri
|
|||||||
RenderObject? targetRenderObject,
|
RenderObject? targetRenderObject,
|
||||||
}) {
|
}) {
|
||||||
// Since the _PagePosition is intended to cover the available space within
|
// Since the _PagePosition is intended to cover the available space within
|
||||||
// its viewport, stop trying to move the target render object to the center
|
// its viewport, stop trying to any scroll, otherwise, could end up changing
|
||||||
// - otherwise, could end up changing which page is visible and moving the
|
// which page is visible and moving the render object out of the viewport.
|
||||||
// targetRenderObject out of the viewport.
|
return Future<void>.value();
|
||||||
return super.ensureVisible(
|
|
||||||
object,
|
|
||||||
alignment: alignment,
|
|
||||||
duration: duration,
|
|
||||||
curve: curve,
|
|
||||||
alignmentPolicy: alignmentPolicy,
|
|
||||||
targetRenderObject: null,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -1006,6 +1006,76 @@ void main() {
|
|||||||
expect(targetMidRightPage1, findsOneWidget);
|
expect(targetMidRightPage1, findsOneWidget);
|
||||||
expect(targetMidLeftPage1, 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
|
// ignore: must_be_immutable
|
||||||
|
Loading…
x
Reference in New Issue
Block a user