@@ -2433,4 +2433,144 @@ void main() {
24332433 expect (controller.focusCleared, true );
24342434 });
24352435 });
2436+
2437+ testWidgets ('Platform views respect hitTestBehavior' , (WidgetTester tester) async {
2438+ final FakePlatformViewController controller = FakePlatformViewController (0 );
2439+
2440+ final List <String > logs = < String > [];
2441+
2442+ // -------------------------
2443+ // | MouseRegion1 | MouseRegion1
2444+ // | |-----------------| | |
2445+ // | | MouseRegion2 | | |- Stack
2446+ // | | |---------| | | |
2447+ // | | |Platform | | | |- MouseRegion2
2448+ // | | |View | | | |- PlatformView
2449+ // | | |---------| | |
2450+ // | | | |
2451+ // | |-----------------| |
2452+ // | |
2453+ // -------------------------
2454+ Widget scaffold (Widget target) {
2455+ return Directionality (
2456+ textDirection: TextDirection .ltr,
2457+ child: Center (
2458+ child: SizedBox (
2459+ width: 600 ,
2460+ height: 600 ,
2461+ child: MouseRegion (
2462+ onEnter: (_) { logs.add ('enter1' ); },
2463+ onExit: (_) { logs.add ('exit1' ); },
2464+ cursor: SystemMouseCursors .forbidden,
2465+ child: Stack (
2466+ children: < Widget > [
2467+ Center (
2468+ child: SizedBox (
2469+ width: 400 ,
2470+ height: 400 ,
2471+ child: MouseRegion (
2472+ onEnter: (_) { logs.add ('enter2' ); },
2473+ onExit: (_) { logs.add ('exit2' ); },
2474+ cursor: SystemMouseCursors .text,
2475+ ),
2476+ ),
2477+ ),
2478+ Center (
2479+ child: SizedBox (
2480+ width: 200 ,
2481+ height: 200 ,
2482+ child: target,
2483+ ),
2484+ ),
2485+ ],
2486+ )
2487+ ),
2488+ ),
2489+ ),
2490+ );
2491+ }
2492+
2493+ final TestGesture gesture = await tester.createGesture (kind: PointerDeviceKind .mouse, pointer: 0 );
2494+ addTearDown (gesture.removePointer);
2495+
2496+ // Test: Opaque
2497+ await tester.pumpWidget (
2498+ scaffold (PlatformViewSurface (
2499+ controller: controller,
2500+ hitTestBehavior: PlatformViewHitTestBehavior .opaque,
2501+ gestureRecognizers: const < Factory <OneSequenceGestureRecognizer >> {}
2502+ ))
2503+ );
2504+ logs.clear ();
2505+
2506+ await gesture.moveTo (const Offset (400 , 300 ));
2507+ expect (logs, < String > ['enter1' ]);
2508+ expect (controller.dispatchedPointerEvents, hasLength (1 ));
2509+ expect (controller.dispatchedPointerEvents[0 ].runtimeType, PointerHoverEvent );
2510+ logs.clear ();
2511+ controller.dispatchedPointerEvents.clear ();
2512+
2513+ // Test: changing no option does not trigger events
2514+ await tester.pumpWidget (
2515+ scaffold (PlatformViewSurface (
2516+ controller: controller,
2517+ hitTestBehavior: PlatformViewHitTestBehavior .opaque,
2518+ gestureRecognizers: const < Factory <OneSequenceGestureRecognizer >> {}
2519+ ))
2520+ );
2521+ expect (logs, isEmpty);
2522+ expect (controller.dispatchedPointerEvents, isEmpty);
2523+
2524+ // Test: Transluscent
2525+ await tester.pumpWidget (
2526+ scaffold (PlatformViewSurface (
2527+ controller: controller,
2528+ hitTestBehavior: PlatformViewHitTestBehavior .translucent,
2529+ gestureRecognizers: const < Factory <OneSequenceGestureRecognizer >> {}
2530+ ))
2531+ );
2532+ expect (logs, < String > ['enter2' ]);
2533+ expect (controller.dispatchedPointerEvents, isEmpty);
2534+ logs.clear ();
2535+
2536+ await gesture.moveBy (const Offset (1 , 1 ));
2537+ expect (logs, isEmpty);
2538+ expect (controller.dispatchedPointerEvents, hasLength (1 ));
2539+ expect (controller.dispatchedPointerEvents[0 ].runtimeType, PointerHoverEvent );
2540+ expect (controller.dispatchedPointerEvents[0 ].position, const Offset (401 , 301 ));
2541+ expect (controller.dispatchedPointerEvents[0 ].localPosition, const Offset (101 , 101 ));
2542+ controller.dispatchedPointerEvents.clear ();
2543+
2544+ // Test: Transparent
2545+ await tester.pumpWidget (
2546+ scaffold (PlatformViewSurface (
2547+ controller: controller,
2548+ hitTestBehavior: PlatformViewHitTestBehavior .transparent,
2549+ gestureRecognizers: const < Factory <OneSequenceGestureRecognizer >> {}
2550+ ))
2551+ );
2552+ expect (logs, isEmpty);
2553+ expect (controller.dispatchedPointerEvents, isEmpty);
2554+
2555+ await gesture.moveBy (const Offset (1 , 1 ));
2556+ expect (logs, isEmpty);
2557+ expect (controller.dispatchedPointerEvents, isEmpty);
2558+
2559+ // Test: Back to opaque
2560+ await tester.pumpWidget (
2561+ scaffold (PlatformViewSurface (
2562+ controller: controller,
2563+ hitTestBehavior: PlatformViewHitTestBehavior .opaque,
2564+ gestureRecognizers: const < Factory <OneSequenceGestureRecognizer >> {}
2565+ ))
2566+ );
2567+ expect (logs, < String > ['exit2' ]);
2568+ expect (controller.dispatchedPointerEvents, isEmpty);
2569+ logs.clear ();
2570+
2571+ await gesture.moveBy (const Offset (1 , 1 ));
2572+ expect (logs, isEmpty);
2573+ expect (controller.dispatchedPointerEvents, hasLength (1 ));
2574+ expect (controller.dispatchedPointerEvents[0 ].runtimeType, PointerHoverEvent );
2575+ });
24362576}
0 commit comments