From abe67b4a1fb96f37d32d3c07ae2074171c640b51 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Fri, 2 Aug 2019 20:08:43 -0700 Subject: [PATCH] Don't enable scroll wheel when scrolling is off (#37211) NeverScrollableScrollPhysics should prevent all scrolling, but the new scrollwheel codepath wasn't checking it. Fixes #35304 --- .../flutter/lib/src/widgets/scrollable.dart | 3 +++ .../flutter/test/widgets/scrollable_test.dart | 18 +++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/packages/flutter/lib/src/widgets/scrollable.dart b/packages/flutter/lib/src/widgets/scrollable.dart index 1dc91e99a0..e6b95670ba 100644 --- a/packages/flutter/lib/src/widgets/scrollable.dart +++ b/packages/flutter/lib/src/widgets/scrollable.dart @@ -547,6 +547,9 @@ class ScrollableState extends State with TickerProviderStateMixin void _handlePointerScroll(PointerEvent event) { assert(event is PointerScrollEvent); + if (_physics != null && !_physics.shouldAcceptUserOffset(position)) { + return; + } final double targetScrollOffset = _targetScrollOffsetForPointerScroll(event); if (targetScrollOffset != position.pixels) { position.jumpTo(targetScrollOffset); diff --git a/packages/flutter/test/widgets/scrollable_test.dart b/packages/flutter/test/widgets/scrollable_test.dart index cc21072a29..ac14564cb3 100644 --- a/packages/flutter/test/widgets/scrollable_test.dart +++ b/packages/flutter/test/widgets/scrollable_test.dart @@ -8,13 +8,14 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; -Future pumpTest(WidgetTester tester, TargetPlatform platform) async { +Future pumpTest(WidgetTester tester, TargetPlatform platform, {bool scrollable = true}) async { await tester.pumpWidget(MaterialApp( theme: ThemeData( platform: platform, ), - home: const CustomScrollView( - slivers: [ + home: CustomScrollView( + physics: scrollable ? null : const NeverScrollableScrollPhysics(), + slivers: const [ SliverToBoxAdapter(child: SizedBox(height: 2000.0)), ], ), @@ -236,4 +237,15 @@ void main() { await tester.sendEventToBinding(testPointer.scroll(const Offset(0.0, -30.0)), result); expect(getScrollOffset(tester), 0.0); }); + + testWidgets('Scroll pointer signals are ignored when scrolling is disabled', (WidgetTester tester) async { + await pumpTest(tester, TargetPlatform.fuchsia, scrollable: false); + final Offset scrollEventLocation = tester.getCenter(find.byType(Viewport)); + final TestPointer testPointer = TestPointer(1, ui.PointerDeviceKind.mouse); + // Create a hover event so that |testPointer| has a location when generating the scroll. + testPointer.hover(scrollEventLocation); + final HitTestResult result = tester.hitTestOnBinding(scrollEventLocation); + await tester.sendEventToBinding(testPointer.scroll(const Offset(0.0, 20.0)), result); + expect(getScrollOffset(tester), 0.0); + }); }