[ios][pv] Reland platform view hitTest approach (again)#185126
Conversation
| - 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
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
38f9074 to
91ac645
Compare
flutter/flutter@2844af6...3d0e822 2026-04-21 [email protected] Reland "Unpin google_mobile_ads" (flutter/flutter#180838) 2026-04-21 [email protected] fix: correct LicenseRegistry docs to reference NOTICES instead of LICENSE (flutter/flutter#184572) 2026-04-21 [email protected] Roll Skia from f8637ade3d92 to a234f0ed7245 (2 revisions) (flutter/flutter#185334) 2026-04-21 [email protected] Roll Skia from 3b338913f623 to f8637ade3d92 (9 revisions) (flutter/flutter#185331) 2026-04-21 [email protected] Fix non-minimal relative imports in flutter_tools (flutter/flutter#183971) 2026-04-21 [email protected] Reapply "Unpin sdk package dependencies" (flutter/flutter#185268) 2026-04-21 [email protected] Remove unused private header (flutter/flutter#185260) 2026-04-20 [email protected] [iOS] Improve LaunchEngine implementation/API/docs (flutter/flutter#185200) 2026-04-20 [email protected] [ios][pv] Reland platform view hitTest approach (again) (flutter/flutter#185126) 2026-04-20 [email protected] Roll Skia from 75c2791c6274 to 3b338913f623 (3 revisions) (flutter/flutter#185304) 2026-04-20 [email protected] ignore avoid_type_to_string lint rule (flutter/flutter#184765) 2026-04-20 [email protected] Fix race condition in modifying release manifest. (flutter/flutter#185185) 2026-04-20 [email protected] In the dev/bots/analyze.dart script, obtain the relevant set of paths from Git instead of crawling the filesystem (flutter/flutter#185058) 2026-04-20 [email protected] [wimp] Implement images for wimp. (flutter/flutter#183913) 2026-04-20 [email protected] add the next batch for VPAT assessment (flutter/flutter#185053) 2026-04-20 [email protected] Roll Packages from c2e3d1f to 01c505f (21 revisions) (flutter/flutter#185287) 2026-04-20 [email protected] Avoid use of direct string injection in GitHub Workflow "run" steps. (flutter/flutter#185301) 2026-04-20 [email protected] Regenerate pubspec.lock (flutter/flutter#185290) 2026-04-20 [email protected] Report an error if the git ls-tree command fails in the content_aware_hash script (flutter/flutter#185170) 2026-04-20 [email protected] Roll Skia from d8415c5d7b91 to 75c2791c6274 (40 revisions) (flutter/flutter#185284) 2026-04-20 [email protected] Move widget_preview_scaffold into pub workspace (flutter/flutter#185176) 2026-04-20 [email protected] [record_use] Run build hooks and link hooks in separate targets (flutter/flutter#184880) 2026-04-20 [email protected] feat: add reloadIsRestart to handle hot reload as a restart for web #179448 (flutter/flutter#183233) 2026-04-20 [email protected] Roll Fuchsia Linux SDK from aDbXQm6WA0wFCAUp-... to LPa7NLiXEZP2A7IwZ... (flutter/flutter#185269) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-packages Please CC [email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
…r#11548) flutter/flutter@2844af6...3d0e822 2026-04-21 [email protected] Reland "Unpin google_mobile_ads" (flutter/flutter#180838) 2026-04-21 [email protected] fix: correct LicenseRegistry docs to reference NOTICES instead of LICENSE (flutter/flutter#184572) 2026-04-21 [email protected] Roll Skia from f8637ade3d92 to a234f0ed7245 (2 revisions) (flutter/flutter#185334) 2026-04-21 [email protected] Roll Skia from 3b338913f623 to f8637ade3d92 (9 revisions) (flutter/flutter#185331) 2026-04-21 [email protected] Fix non-minimal relative imports in flutter_tools (flutter/flutter#183971) 2026-04-21 [email protected] Reapply "Unpin sdk package dependencies" (flutter/flutter#185268) 2026-04-21 [email protected] Remove unused private header (flutter/flutter#185260) 2026-04-20 [email protected] [iOS] Improve LaunchEngine implementation/API/docs (flutter/flutter#185200) 2026-04-20 [email protected] [ios][pv] Reland platform view hitTest approach (again) (flutter/flutter#185126) 2026-04-20 [email protected] Roll Skia from 75c2791c6274 to 3b338913f623 (3 revisions) (flutter/flutter#185304) 2026-04-20 [email protected] ignore avoid_type_to_string lint rule (flutter/flutter#184765) 2026-04-20 [email protected] Fix race condition in modifying release manifest. (flutter/flutter#185185) 2026-04-20 [email protected] In the dev/bots/analyze.dart script, obtain the relevant set of paths from Git instead of crawling the filesystem (flutter/flutter#185058) 2026-04-20 [email protected] [wimp] Implement images for wimp. (flutter/flutter#183913) 2026-04-20 [email protected] add the next batch for VPAT assessment (flutter/flutter#185053) 2026-04-20 [email protected] Roll Packages from c2e3d1f to 01c505f (21 revisions) (flutter/flutter#185287) 2026-04-20 [email protected] Avoid use of direct string injection in GitHub Workflow "run" steps. (flutter/flutter#185301) 2026-04-20 [email protected] Regenerate pubspec.lock (flutter/flutter#185290) 2026-04-20 [email protected] Report an error if the git ls-tree command fails in the content_aware_hash script (flutter/flutter#185170) 2026-04-20 [email protected] Roll Skia from d8415c5d7b91 to 75c2791c6274 (40 revisions) (flutter/flutter#185284) 2026-04-20 [email protected] Move widget_preview_scaffold into pub workspace (flutter/flutter#185176) 2026-04-20 [email protected] [record_use] Run build hooks and link hooks in separate targets (flutter/flutter#184880) 2026-04-20 [email protected] feat: add reloadIsRestart to handle hot reload as a restart for web #179448 (flutter/flutter#183233) 2026-04-20 [email protected] Roll Fuchsia Linux SDK from aDbXQm6WA0wFCAUp-... to LPa7NLiXEZP2A7IwZ... (flutter/flutter#185269) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-packages Please CC [email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
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.