@@ -16,23 +16,31 @@ Future<void> pumpTest(
16
16
TargetPlatform ? platform, {
17
17
bool scrollable = true ,
18
18
bool reverse = false ,
19
+ Set <LogicalKeyboardKey >? axisModifier,
20
+ Axis scrollDirection = Axis .vertical,
19
21
ScrollController ? controller,
20
22
bool enableMouseDrag = true ,
21
23
}) async {
22
24
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,
26
30
),
27
31
theme: ThemeData (
28
32
platform: platform,
29
33
),
30
34
home: CustomScrollView (
31
35
controller: controller,
32
36
reverse: reverse,
37
+ scrollDirection: scrollDirection,
33
38
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
+ )),
36
44
],
37
45
),
38
46
));
@@ -399,6 +407,118 @@ void main() {
399
407
expect (getScrollOffset (tester), 20.0 );
400
408
});
401
409
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
+
402
522
group ('setCanDrag to false with active drag gesture: ' , () {
403
523
Future <void > pumpTestWidget (WidgetTester tester, { required bool canDrag }) {
404
524
return tester.pumpWidget (
0 commit comments