Repository navigation
[cupertino_ui] Add rubber-band physics simulation to CupertinoSheet when enableDrag is false - #12516
xxxOVALxxx wants to merge 4 commits into
Conversation
There was a problem hiding this comment.
Code Review
This pull request implements a rubber-banding and spring-back animation for Cupertino sheets when dragging is disabled, using Apple's rubber-banding formula and a physical spring simulation. It also ensures that sheets ignore gestures mid-dismissal. Feedback suggests declaring the global _sheetSpring variable as final, optimizing the squaring calculation in _computeRubberBandFriction by replacing math.pow with direct multiplication, and checking navigator.mounted before calling navigator.didStopUserGesture() to prevent potential exceptions during the animation.
|
I'm trying to fix an issue where, when passing the To reproduce this, take the penultimate commit and replace line 813 with: When re-intercepting the sheet on the fly, the hit test/arena for some reason doesn’t include the Scrollable’s own internal VerticalDragGestureRecognizer (it’s simply missing from the participants in Gesture arena 13), which causes all vertical drag events to be handled exclusively by the external _CupertinoDragGestureDetector, which can only move the sheet itself and is unaware of applyUserOffset or content scrolling. debugPrintGestureArenaDiagnostics logs
Screen.Recording.2026-09-12.at.11.46.14.movI committed my latest progress in the most recent commit, which fixes the problem but introduces a new regression in behavior when the entire sheet becomes a scrollable area. Screen.Recording.2026-09-12.at.11.04.19.movI’m not sure if it’s possible to solve this problem without reworking the widget’s architecture. |
This PR adds native iOS-style rubber-banding resistance to
CupertinoSheetRoute/showCupertinoSheetwhen dragging is disabled (enableDrag: false)Flutter on the left, SwiftUI on the right
output.mp4
Flutter example
SwiftUI example
Pre-Review Checklist
[shared_preferences]///).If you need help, consider asking for advice on the #hackers-new channel on Discord.
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.Footnotes
Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling. ↩ ↩2