Unverified Commit 4dec56b2 authored by Bruno Leroux's avatar Bruno Leroux Committed by GitHub

Fix PageView throws Null check error (#104405)

parent f377f61f
...@@ -462,6 +462,20 @@ class _PagePosition extends ScrollPositionWithSingleContext implements PageMetri ...@@ -462,6 +462,20 @@ class _PagePosition extends ScrollPositionWithSingleContext implements PageMetri
return result; return result;
} }
@override
void absorb(ScrollPosition other) {
super.absorb(other);
assert(_cachedPage == null);
if (other is! _PagePosition) {
return;
}
if (other._cachedPage != null) {
_cachedPage = other._cachedPage;
}
}
@override @override
bool applyContentDimensions(double minScrollExtent, double maxScrollExtent) { bool applyContentDimensions(double minScrollExtent, double maxScrollExtent) {
final double newMinScrollExtent = minScrollExtent + _initialPageOffset; final double newMinScrollExtent = minScrollExtent + _initialPageOffset;
......
...@@ -133,6 +133,45 @@ void main() { ...@@ -133,6 +133,45 @@ void main() {
expect(find.text('Illinois'), findsOneWidget); expect(find.text('Illinois'), findsOneWidget);
}); });
testWidgets('_PagePosition.applyViewportDimension should not throw', (WidgetTester tester) async {
// Regression test for https://github.com/flutter/flutter/issues/101007
final PageController controller = PageController(
initialPage: 1,
);
// Set the starting viewportDimension to 0.0
await tester.binding.setSurfaceSize(Size.zero);
final MediaQueryData mediaQueryData = MediaQueryData.fromWindow(tester.binding.window);
Widget build(Size size) {
return MediaQuery(
data: mediaQueryData.copyWith(size: size),
child: Directionality(
textDirection: TextDirection.ltr,
child: Center(
child: SizedBox.expand(
child: PageView(
controller: controller,
onPageChanged: (int page) { },
children: kStates.map<Widget>((String state) => Text(state)).toList(),
),
),
),
),
);
}
await tester.pumpWidget(build(Size.zero));
const Size surfaceSize = Size(500,400);
await tester.binding.setSurfaceSize(surfaceSize);
await tester.pumpWidget(build(surfaceSize));
expect(tester.takeException(), isNull);
// Reset TestWidgetsFlutterBinding surfaceSize
await tester.binding.setSurfaceSize(null);
});
testWidgets('PageController cannot return page while unattached', testWidgets('PageController cannot return page while unattached',
(WidgetTester tester) async { (WidgetTester tester) async {
final PageController controller = PageController(); final PageController controller = PageController();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment