Fix Jumping Bottom Sheets in AI Reanimated Code
A jumpy bottom sheet usually means the gesture and the animation are not sharing state on the UI thread. Fix the handoff and it glides.
TL;DR
AI-generated Reanimated bottom sheets jump because the gesture and the spring animation are not coordinated on the UI thread: state updates cross to JS, the gesture does not seed the animation's starting value, or snapping fights the drag. Fix it by keeping the shared value on the UI thread, seeding the spring from the gesture's current position, and snapping to clear detents. Build the sheet from a free reference and tune the handoff. Smoothness is in the gesture-to-animation coordination.
AI-generated Reanimated bottom sheet jumping or stuttering? The short answer: the gesture and the spring animation are not sharing state smoothly on the UI thread, so there is a visible jump when the drag hands off to the snap. Fix the handoff, keep the value on the UI thread, seed the spring from the gesture, snap to clear detents, and it glides. Build the sheet from a free VP0 design, the free iOS design library for AI builders, and tune the coordination. The stakes are real: about 76% of developers now use or plan to use AI tools in their work.
Who this is for
This is for React Native developers whose AI-generated Reanimated bottom sheet drags roughly, jumps on release, or stutters, and who want it to feel native-smooth.
Why the sheet jumps
A smooth sheet is one continuous motion: the finger drags it, and on release a spring carries it to a snap point from exactly where the finger left off. Jumps happen when that continuity breaks. If the shared value updates cross to the JS thread, frames drop. If the release animation does not start from the gesture’s current position, the sheet teleports before springing. And if snapping sets the position directly instead of animating from the current value and velocity, it resets visibly. The React Native Reanimated docs and Gesture Handler docs cover the UI-thread model.
| Cause | Symptom | Fix |
|---|---|---|
| Value crosses to JS | Stutter, dropped frames | Keep it on the UI thread |
| Spring not seeded | Jump on release | Start from gesture position |
| Snap sets position | Teleport to detent | Animate with velocity |
| Gesture and anim separate | Fighting motion | Share one shared value |
| No clear detents | Ambiguous resting points | Define snap points |
Build the sheet free with a VP0 design
Build the sheet UI from a reference, then wire the gesture and animation correctly. Pick a sheet screen in VP0, copy its link, and prompt your AI builder:
Build a React Native bottom sheet from this design: [paste VP0 link] using Reanimated and Gesture Handler. Drive the sheet height with a shared value updated on the UI thread by the pan gesture, and on release animate to the nearest snap point with a spring seeded from the current position and gesture velocity. Match the palette and spacing from the reference, and generate clean code.
For neighboring sheet and animation fixes, see a draggable bottom sheet over a map in SwiftUI, fixing Reanimated Tinder swipe card memory leaks, how to fix AI React Native shadow hallucinations, and how to make an AI app look native on iOS.
Coordinate the gesture and the spring
The whole fix is continuity on the UI thread. Keep the sheet’s position in a shared value that the pan gesture updates directly on the UI thread, so dragging is frame-perfect. When the gesture ends, animate that same value to the nearest detent with a spring, passing the gesture’s velocity so the motion flows from the drag into the snap with no jump. Define clear snap points (peek, medium, full) so resting positions are unambiguous. AI builders often miss the seeding and the UI-thread placement, so prompt for them explicitly and verify. Get the handoff right and the sheet feels exactly like a native one.
Common mistakes
The first mistake is updating the position on the JS thread, causing stutter. The second is a release animation that does not start from the gesture’s value, causing a jump. The third is snapping by setting position instead of animating with velocity. The fourth is no defined detents. The fifth is paying for a sheet library when a free VP0 design plus correct Reanimated does it.
Key takeaways
- A jumpy Reanimated sheet means the gesture and spring are not coordinated on the UI thread.
- Keep the position in a shared value updated on the UI thread by the gesture.
- Seed the release spring from the gesture’s current position and velocity.
- Snap to clear, defined detents instead of setting position directly.
- Build the sheet UI from a free VP0 reference and tune the handoff.
Sources
- React Native Reanimated: UI-thread animations in React Native.
- React Native Gesture Handler: native-driven touch gestures.
- React Native performance guide: the official guidance on profiling and memory.
Frequently asked questions
Why is my Reanimated bottom sheet jumping or stuttering? The gesture and animation are not coordinated on the UI thread, the value crosses to JS, the spring is not seeded, or snapping fights the drag. Coordinate them on the UI thread.
How do I make a Reanimated bottom sheet smooth? Drive position with a UI-thread shared value updated by the gesture, animate to snap points with a spring seeded from the current position, using Gesture Handler.
Why does AI-generated Reanimated code jump? It often writes the gesture and animation without UI-thread coordination or seeding, so the drag-to-spring handoff jumps. Fix the coordination.
What is the right way to snap a bottom sheet? Animate the shared value to the nearest detent with a spring on gesture end, using velocity, so the motion continues smoothly rather than resetting.
Frequently asked questions
Why is my Reanimated bottom sheet jumping or stuttering?
Usually the gesture and the animation are not coordinated on the UI thread: the shared value crosses to JS, the spring does not start from the gesture's current position, or snapping fights the drag. Keep the value on the UI thread, seed the spring from where the gesture is, and snap to clear detents.
How do I make a Reanimated bottom sheet smooth?
Drive the sheet position with a shared value updated on the UI thread by the gesture, animate to snap points with a spring seeded from the current position, and use the Gesture Handler so the drag and animation share state. Build the sheet UI from a free VP0 reference and tune the handoff.
Why does AI-generated Reanimated code jump?
AI builders often write the gesture and animation as if they were on the JS thread or without seeding the animation from the gesture's value, so there is a visible jump when the drag hands off to the spring. Coordinating them on the UI thread fixes it.
What is the right way to snap a bottom sheet?
Animate the shared value to the nearest detent with a spring when the gesture ends, using the gesture velocity, rather than setting position directly. Snapping should continue the motion smoothly, not reset it.
Part of the React Native & Expo: Mobile Frontend Architecture hub. Browse all VP0 topics →
Keep reading
Fix Reanimated Tinder Swipe Card Memory Leaks in RN
AI-generated Tinder swipe stack leaking memory in React Native? Here is why cards and animation values pile up, and how to clean them so it stays smooth.
Custom Fonts Not Loading in React Native Release Build
Custom fonts work in dev but vanish in your React Native release build? Here are the real causes, linking, Info.plist, and naming, and the fixes.
Bolt.new React Router Errors in Expo? Swap the Router
Bolt.new app throwing React Router DOM errors when you move to Expo mobile? React Router is for the web. Replace it with Expo Router or React Navigation.
AdMob Banner Template in React Native, Free
Add an AdMob banner to your React Native app the right way. A free template for clean placement, ATT consent, and ads that do not wreck the experience.
AI Interior Design Room Scanner UI, React Native Free
Build an AI interior design room scanner UI in React Native from a free template. Get the scan, generate, and before-after flow with Claude Code or Cursor.
Anki Flashcard Swipe + SRS Algorithm UI, React Native
Build an Anki style flashcard app in React Native from a free template. Get the swipe review UI and the spaced-repetition algorithm with Claude Code or Cursor.