@@ -876,6 +876,76 @@ void main() {
876876 });
877877 });
878878
879+ testWidgets ('supportedDevices update test' , (WidgetTester tester) async {
880+ // Regression test for https://github.com/flutter/flutter/issues/111716
881+ bool didStartPan = false ;
882+ Offset ? panDelta;
883+ bool didEndPan = false ;
884+ Widget buildFrame (Set <PointerDeviceKind >? supportedDevices) {
885+ return GestureDetector (
886+ onPanStart: (DragStartDetails details) {
887+ didStartPan = true ;
888+ },
889+ onPanUpdate: (DragUpdateDetails details) {
890+ panDelta = (panDelta ?? Offset .zero) + details.delta;
891+ },
892+ onPanEnd: (DragEndDetails details) {
893+ didEndPan = true ;
894+ },
895+ supportedDevices: supportedDevices,
896+ child: Container (
897+ color: const Color (0xFF00FF00 ),
898+ )
899+ );
900+ }
901+
902+ await tester.pumpWidget (buildFrame (< PointerDeviceKind > {PointerDeviceKind .mouse}));
903+
904+ expect (didStartPan, isFalse);
905+ expect (panDelta, isNull);
906+ expect (didEndPan, isFalse);
907+
908+ await tester.dragFrom (const Offset (10.0 , 10.0 ), const Offset (20.0 , 30.0 ), kind: PointerDeviceKind .mouse);
909+
910+ // Matching device should allow gesture.
911+ expect (didStartPan, isTrue);
912+ expect (panDelta! .dx, 20.0 );
913+ expect (panDelta! .dy, 30.0 );
914+ expect (didEndPan, isTrue);
915+
916+ didStartPan = false ;
917+ panDelta = null ;
918+ didEndPan = false ;
919+
920+ await tester.pumpWidget (buildFrame (< PointerDeviceKind > {PointerDeviceKind .stylus}));
921+
922+ await tester.dragFrom (const Offset (10.0 , 10.0 ), const Offset (20.0 , 30.0 ), kind: PointerDeviceKind .mouse);
923+ // Non-matching device should not lead to any callbacks.
924+ expect (didStartPan, isFalse);
925+ expect (panDelta, isNull);
926+ expect (didEndPan, isFalse);
927+
928+ await tester.dragFrom (const Offset (10.0 , 10.0 ), const Offset (20.0 , 30.0 ), kind: PointerDeviceKind .stylus);
929+ // Matching device should allow gesture.
930+ expect (didStartPan, isTrue);
931+ expect (panDelta! .dx, 20.0 );
932+ expect (panDelta! .dy, 30.0 );
933+ expect (didEndPan, isTrue);
934+
935+ didStartPan = false ;
936+ panDelta = null ;
937+ didEndPan = false ;
938+
939+ // If set to null, events from all device types will be recognized
940+ await tester.pumpWidget (buildFrame (null ));
941+
942+ await tester.dragFrom (const Offset (10.0 , 10.0 ), const Offset (20.0 , 30.0 ), kind: PointerDeviceKind .unknown);
943+ expect (didStartPan, isTrue);
944+ expect (panDelta! .dx, 20.0 );
945+ expect (panDelta! .dy, 30.0 );
946+ expect (didEndPan, isTrue);
947+ });
948+
879949 testWidgets ('supportedDevices is respected' , (WidgetTester tester) async {
880950 bool didStartPan = false ;
881951 Offset ? panDelta;
0 commit comments