Fix PageView throws Null check error (#104405)
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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<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',
|
||||
(WidgetTester tester) async {
|
||||
final PageController controller = PageController();
|
||||
|
||||
Reference in New Issue
Block a user