@@ -16,23 +16,31 @@ Future<void> pumpTest(
1616 TargetPlatform ? platform, {
1717 bool scrollable = true ,
1818 bool reverse = false ,
19+ Set <LogicalKeyboardKey >? axisModifier,
20+ Axis scrollDirection = Axis .vertical,
1921 ScrollController ? controller,
2022 bool enableMouseDrag = true ,
2123}) async {
2224 await tester.pumpWidget (MaterialApp (
23- scrollBehavior: const NoScrollbarBehavior ().copyWith (dragDevices: enableMouseDrag
24- ? < ui.PointerDeviceKind > {...ui.PointerDeviceKind .values}
25- : null ,
25+ scrollBehavior: const NoScrollbarBehavior ().copyWith (
26+ dragDevices: enableMouseDrag
27+ ? < ui.PointerDeviceKind > {...ui.PointerDeviceKind .values}
28+ : null ,
29+ pointerAxisModifiers: axisModifier,
2630 ),
2731 theme: ThemeData (
2832 platform: platform,
2933 ),
3034 home: CustomScrollView (
3135 controller: controller,
3236 reverse: reverse,
37+ scrollDirection: scrollDirection,
3338 physics: scrollable ? null : const NeverScrollableScrollPhysics (),
34- slivers: const < Widget > [
35- SliverToBoxAdapter (child: SizedBox (height: 2000.0 )),
39+ slivers: < Widget > [
40+ SliverToBoxAdapter (child: SizedBox (
41+ height: scrollDirection == Axis .vertical ? 2000.0 : null ,
42+ width: scrollDirection == Axis .horizontal ? 2000.0 : null ,
43+ )),
3644 ],
3745 ),
3846 ));
@@ -399,6 +407,118 @@ void main() {
399407 expect (getScrollOffset (tester), 20.0 );
400408 });
401409
410+ testWidgets ('Scrolls horizontally when shift is pressed by default' , (WidgetTester tester) async {
411+ await pumpTest (
412+ tester,
413+ debugDefaultTargetPlatformOverride,
414+ scrollDirection: Axis .horizontal,
415+ );
416+
417+ final Offset scrollEventLocation = tester.getCenter (find.byType (Viewport ));
418+ final TestPointer testPointer = TestPointer (1 , ui.PointerDeviceKind .mouse);
419+ // Create a hover event so that |testPointer| has a location when generating the scroll.
420+ testPointer.hover (scrollEventLocation);
421+ await tester.sendEventToBinding (testPointer.scroll (const Offset (0.0 , 20.0 )));
422+ // Vertical input not accepted
423+ expect (getScrollOffset (tester), 0.0 );
424+
425+ await tester.sendKeyDownEvent (LogicalKeyboardKey .shift);
426+ await tester.sendEventToBinding (testPointer.scroll (const Offset (0.0 , 20.0 )));
427+ // Vertical input flipped to horizontal and accepted.
428+ expect (getScrollOffset (tester), 20.0 );
429+ await tester.sendKeyUpEvent (LogicalKeyboardKey .shift);
430+ await tester.pump ();
431+
432+ await tester.sendEventToBinding (testPointer.scroll (const Offset (0.0 , 20.0 )));
433+ // Vertical input not accepted
434+ expect (getScrollOffset (tester), 20.0 );
435+ }, variant: TargetPlatformVariant .all ());
436+
437+ testWidgets ('Scroll axis is not flipped for trackpad' , (WidgetTester tester) async {
438+ await pumpTest (
439+ tester,
440+ debugDefaultTargetPlatformOverride,
441+ scrollDirection: Axis .horizontal,
442+ );
443+
444+ final Offset scrollEventLocation = tester.getCenter (find.byType (Viewport ));
445+ final TestPointer testPointer = TestPointer (1 , ui.PointerDeviceKind .trackpad);
446+ // Create a hover event so that |testPointer| has a location when generating the scroll.
447+ testPointer.hover (scrollEventLocation);
448+ await tester.sendEventToBinding (testPointer.scroll (const Offset (0.0 , 20.0 )));
449+ // Vertical input not accepted
450+ expect (getScrollOffset (tester), 0.0 );
451+
452+ await tester.sendKeyDownEvent (LogicalKeyboardKey .shift);
453+ await tester.sendEventToBinding (testPointer.scroll (const Offset (0.0 , 20.0 )));
454+ // Vertical input not flipped.
455+ expect (getScrollOffset (tester), 0.0 );
456+ await tester.sendKeyUpEvent (LogicalKeyboardKey .shift);
457+ await tester.pump ();
458+
459+ await tester.sendEventToBinding (testPointer.scroll (const Offset (0.0 , 20.0 )));
460+ // Vertical input not accepted
461+ expect (getScrollOffset (tester), 0.0 );
462+ }, variant: TargetPlatformVariant .all ());
463+
464+ testWidgets ('Scrolls horizontally when custom key is pressed' , (WidgetTester tester) async {
465+ await pumpTest (
466+ tester,
467+ debugDefaultTargetPlatformOverride,
468+ scrollDirection: Axis .horizontal,
469+ axisModifier: < LogicalKeyboardKey > { LogicalKeyboardKey .altLeft },
470+ );
471+
472+ final Offset scrollEventLocation = tester.getCenter (find.byType (Viewport ));
473+ final TestPointer testPointer = TestPointer (1 , ui.PointerDeviceKind .mouse);
474+ // Create a hover event so that |testPointer| has a location when generating the scroll.
475+ testPointer.hover (scrollEventLocation);
476+ await tester.sendEventToBinding (testPointer.scroll (const Offset (0.0 , 20.0 )));
477+ // Vertical input not accepted
478+ expect (getScrollOffset (tester), 0.0 );
479+
480+ await tester.sendKeyDownEvent (LogicalKeyboardKey .altLeft);
481+ await tester.sendEventToBinding (testPointer.scroll (const Offset (0.0 , 20.0 )));
482+ // Vertical input flipped to horizontal and accepted.
483+ expect (getScrollOffset (tester), 20.0 );
484+ await tester.sendKeyUpEvent (LogicalKeyboardKey .altLeft);
485+ await tester.pump ();
486+
487+ await tester.sendEventToBinding (testPointer.scroll (const Offset (0.0 , 20.0 )));
488+ // Vertical input not accepted
489+ expect (getScrollOffset (tester), 20.0 );
490+ }, variant: TargetPlatformVariant .all ());
491+
492+ testWidgets ('Still scrolls horizontally when other keys are pressed at the same time' , (WidgetTester tester) async {
493+ await pumpTest (
494+ tester,
495+ debugDefaultTargetPlatformOverride,
496+ scrollDirection: Axis .horizontal,
497+ axisModifier: < LogicalKeyboardKey > { LogicalKeyboardKey .altLeft },
498+ );
499+
500+ final Offset scrollEventLocation = tester.getCenter (find.byType (Viewport ));
501+ final TestPointer testPointer = TestPointer (1 , ui.PointerDeviceKind .mouse);
502+ // Create a hover event so that |testPointer| has a location when generating the scroll.
503+ testPointer.hover (scrollEventLocation);
504+ await tester.sendEventToBinding (testPointer.scroll (const Offset (0.0 , 20.0 )));
505+ // Vertical input not accepted
506+ expect (getScrollOffset (tester), 0.0 );
507+
508+ await tester.sendKeyDownEvent (LogicalKeyboardKey .altLeft);
509+ await tester.sendKeyDownEvent (LogicalKeyboardKey .space);
510+ await tester.sendEventToBinding (testPointer.scroll (const Offset (0.0 , 20.0 )));
511+ // Vertical flipped & accepted.
512+ expect (getScrollOffset (tester), 20.0 );
513+ await tester.sendKeyUpEvent (LogicalKeyboardKey .altLeft);
514+ await tester.sendKeyUpEvent (LogicalKeyboardKey .space);
515+ await tester.pump ();
516+
517+ await tester.sendEventToBinding (testPointer.scroll (const Offset (0.0 , 20.0 )));
518+ // Vertical input not accepted
519+ expect (getScrollOffset (tester), 20.0 );
520+ }, variant: TargetPlatformVariant .all ());
521+
402522 group ('setCanDrag to false with active drag gesture: ' , () {
403523 Future <void > pumpTestWidget (WidgetTester tester, { required bool canDrag }) {
404524 return tester.pumpWidget (
0 commit comments