[DO_NOT_LAND (pending G3Fix)] [ios][pv] Reland platform view hitTest approach (again)#185126
[DO_NOT_LAND (pending G3Fix)] [ios][pv] Reland platform view hitTest approach (again)#185126hellohuanlin wants to merge 8 commits intoflutter:masterfrom
Conversation
address comments and nits inverse dep and rename rename policy to touch blocking only support passing via widget format update dart ui api update some comments and fix dart test add a warning add a warning fix tests nit duplicate hit test request/response types on web fix web platofrm nit update fallback format address comments format use runZonedGuarded autoformatter bad remove unused code linter error address comments final comment nit remove & recommended by loic optional comment nit
…policy to doNotBlockGesture policy
…rough bug address comment
| - name: Mac_ios native_platform_view_ui_tests_ios | ||
| recipe: devicelab/devicelab_drone | ||
| presubmit: false | ||
| presubmit: true |
There was a problem hiding this comment.
Will revert this after verifying it worked on CI.
There was a problem hiding this comment.
Code Review
This pull request implements a synchronous hit-testing mechanism for iOS platform views, enabling the Flutter framework to decide whether a touch should be delivered to a native view or blocked by overlapping Flutter widgets. Key changes include adding an onHitTest callback to the PlatformDispatcher, introducing the NativeHitTestTarget mixin for render objects, and exposing a new gestureBlockingPolicy for UiKitView. Feedback suggests optimizing the hitTest:withEvent: override in FlutterTouchInterceptingView by checking view visibility and interaction status before performing the framework hit test.
|
@loic-sharma @chunhtai @vashworth FYI the first 6 commits are exactly the same as previous PR landed. I added 2 new commits:
|
Confirmed the fix passes the test. Will disable the pre-submit |
226b0de to
38f9074
Compare
This PR tries to reland the previous PR: #183484. Refer to it for more details.
What happened to the previous PR?
2 tests from
ios_platform_view_ui_testfailed due to edge swipe gesture (https://www.youtube.com/watch?v=MVO5b0eEdw8). Cupertino puts a gesture listener on left edge of screen. When tapping there, the hitTest logic returns the gesture listener as the first hit (instead of our platform view), hence blocking the platform view.Why we didn't find this issue before?
Because it only happen to iPhone, but I use iPad for testing.
What's the fix?
In flutter, hitTest returns a list of all targets that should be hit tested. So instead of checking if the first hit is the platform view, we check if the result contains any platform view.
I have also created a UIKit app, and verified that the expected behavior is that platform view should still receive touch even if swipe edge back gesture is recognized.
A key info is that during Flutter's hitTest operation, the result list will not contain a target if it is blocked by another target in front (e.g. context menu covering a platform view).
If there are multiple platform views, that's fine too, because UIKit itself will perform hitTest which finds the correct touch intercepting view, which sends the request to framework.
List which issues are fixed by this PR. You must list at least one issue. An issue is not required if the PR fixes something trivial like a typo.
Fixes #179916
Fixes #175099
If you had to change anything in the flutter/tests repo, include a link to the migration guide as per the breaking change policy.
Pre-launch Checklist
///).If you need help, consider asking for advice on the #hackers-new channel on Discord.
If this change needs to override an active code freeze, provide a comment explaining why. The code freeze workflow can be overridden by code reviewers. See pinned issues for any active code freezes with guidance.
Note: The Flutter team is currently trialing the use of Gemini Code Assist for GitHub. Comments from the
gemini-code-assistbot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed.