From 4dec56b2c9326b33b156bb053c8a6733778fedf7 Mon Sep 17 00:00:00 2001 From: Bruno Leroux Date: Wed, 8 Jun 2022 23:48:09 +0200 Subject: [PATCH] Fix PageView throws Null check error (#104405) --- .../flutter/lib/src/widgets/page_view.dart | 14 +++++++ .../flutter/test/widgets/page_view_test.dart | 39 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/packages/flutter/lib/src/widgets/page_view.dart b/packages/flutter/lib/src/widgets/page_view.dart index 435d6b6dc1..911bb2cfaa 100644 --- a/packages/flutter/lib/src/widgets/page_view.dart +++ b/packages/flutter/lib/src/widgets/page_view.dart @@ -462,6 +462,20 @@ class _PagePosition extends ScrollPositionWithSingleContext implements PageMetri 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 bool applyContentDimensions(double minScrollExtent, double maxScrollExtent) { final double newMinScrollExtent = minScrollExtent + _initialPageOffset; diff --git a/packages/flutter/test/widgets/page_view_test.dart b/packages/flutter/test/widgets/page_view_test.dart index a0b82be017..20bf30e01a 100644 --- a/packages/flutter/test/widgets/page_view_test.dart +++ b/packages/flutter/test/widgets/page_view_test.dart @@ -133,6 +133,45 @@ void main() { 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((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', (WidgetTester tester) async { final PageController controller = PageController();