You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
FPS down when I'm using ReanimatedSwipeable from import Swipeable from 'react-native-gesture-handler/ReanimatedSwipeable' in each item Items are not been loaded until fetch from API is done, so this is not a load data issue. If I replace it for Swipeable from import Swipeable from 'react-native-gesture-handler/Swipeable' all work great
This issue is happening in Dev and Release apps and using Hermes + RN's New arch.
Note: I applied FlatList performance strategies and tested it with/without them and the issue is still happening.
Steps to reproduce
Run app on real device (issue is most visible on Android devices).
Hi, I tested both the legacy, and the reanimated Swipeable on the main branch, using the FlashList and useBenchmark from @shopify/flash-list.
I didn't notice any performance advantage in using the legacy Swipeable over the reanimated Swipeable, both averaged 30fps on Samsung S21 Ultra.
I also encounter the slow performance on scrolling on ReanimatedSwipeable, it looks jittery when scrolled, but only when I use the methods like onSwipeableOpen or onSwipeableClose. When I remove these, it's back to normal.
I second the usage of onSwipeableOpen={() => { }} leads to huge stutter. @davelynInes have you found any workaround for using onSwipeableOpen without having an unusable app ?
I used the old/legacy react-native-gesture-handler/Swipeable for now. I didn't have issues with it.
I added ReanimatedSwipeable to a SectionList and JS FPS dropped from 60 to much lower during scrolling and other animations.
I spent a few hours trying to figure out if there was something wrong with my code and optimize performance.
Commenting out the wrapping brought back buttery performance.
It must be either creating a bunch of views, or running a bunch of code, because it's a serious drain on performance.
Just to try to bump this issue: I'm having the same problem.
I tried what @davelynInes suggested about using the old/legacy react-native-gesture-handler/Swipeable and it worked.
I noticed that there are other PRs and/or issues related to this too, so it would be great if this issue could be priorised 🙏🏻
Have a good day.
So @davelynInespost (at the top of the thread) sparked my attention.
What we know is that setting up Gesture is a very expensive operation, and it’s usually recommended to useMemo the gesture. ReanimatedSwipeable tries that, but after inspecting the code I can see that onSwipeableOpen and onSwipeableClose are directly passed as dependencies to dispatchEndEvents and dispatchImmediateEvents, which are dependencies for animateRow. Long story short, that simple prop causes the whole memoization chain to break, rendering every effort to memoize the Gesture useless. That’s the ugly and tricky part about useCallback and useMemo: a single mistake is enough.
You could try to pass a stable function to onSwipeableOpen with useCallback and see if that fixes the issue. If that doesn’t work, ReanimatedSwipeable itself should be wrapped with memo on top of that. But ReanimatedSwipeable needs fully stable props to prevent tapGesture from being re-created over and over again.
I did not verify my findings, but I am pretty sure that this could be the culprit.
One more hint: if used with FlatList, which uses no recycling, using ReanimatedSwipeable is not recommended, as it will re-create the item every time, and the gesture setup is definitely expensive.
Use Flashlist, or better, LegendList
Opened a fix for the inline-callback memoization break: #4466
onSwipeableOpen / onSwipeableClose (and the other event props) were in the worklet dependency chain, so a new function identity on each parent render reconfigured the native pan/tap handlers. The PR keeps those callbacks behind stable wrappers and adds a regression test.
Activity
github-actions commentedon Dec 21, 2024
Hey! 👋
The issue doesn't seem to contain a minimal reproduction.
Could you provide a snack or a link to a GitHub repository under your username that reproduces the problem?
latekvo commentedon Jan 9, 2025
Hi, I tested both the legacy, and the reanimated
Swipeableon themainbranch, using theFlashListanduseBenchmarkfrom@shopify/flash-list.I didn't notice any performance advantage in using the legacy Swipeable over the reanimated Swipeable, both averaged 30fps on Samsung S21 Ultra.
Test code - press to uncollapse
Does this issue still occur for you on version
2.22.0-rc.0?If so, could you please provide a reproduction where the difference is visible?
davelynInes commentedon Jan 15, 2025
I also encounter the slow performance on scrolling on ReanimatedSwipeable, it looks jittery when scrolled, but only when I use the methods like onSwipeableOpen or onSwipeableClose. When I remove these, it's back to normal.
<ReanimatedSwipeable
//containerStyle={[style]}
ref={reanimatedRef}
friction={2}
leftThreshold={80}
rightThreshold={80}
renderLeftActions={LeftAction}
renderRightActions={RightAction}
onSwipeableOpen={() => {
console.log('jittery');
}}
>
{children}
Can you please try and check this?
Baart commentedon Feb 12, 2025
I second the usage of onSwipeableOpen={() => { }} leads to huge stutter.
@davelynInes have you found any workaround for using onSwipeableOpen without having an unusable app ?
davelynInes commentedon Feb 12, 2025
I used the old/legacy react-native-gesture-handler/Swipeable for now. I didn't have issues with it.
RohovDmytro commentedon Feb 19, 2025
I confirm the new Swipeable is very slow within an Animated.FlatList.
zrina1314 commentedon Mar 3, 2025
What version are you using
roo12312 commentedon May 4, 2025
Same here... Old swipeable is so clean and fast in android
mysticmew7 commentedon Sep 3, 2025
I added ReanimatedSwipeable to a SectionList and JS FPS dropped from 60 to much lower during scrolling and other animations.
I spent a few hours trying to figure out if there was something wrong with my code and optimize performance.
Commenting out the wrapping brought back buttery performance.
It must be either creating a bunch of views, or running a bunch of code, because it's a serious drain on performance.
RohovDmytro commentedon Sep 20, 2025
Can confirm that The drain in performance is is huge, almost doubling rendering time of each of my list item.
pablogdcr commentedon Oct 29, 2025
Hi, I'm still facing the same issue: Expo 54, React-Native 0.81.5, new architecture.
FPS drops a lot when scrolling.
demetrio commentedon Nov 2, 2025
Just to try to bump this issue: I'm having the same problem.
I tried what @davelynInes suggested about using the old/legacy react-native-gesture-handler/Swipeable and it worked.
I noticed that there are other PRs and/or issues related to this too, so it would be great if this issue could be priorised 🙏🏻
Have a good day.
hirbod commentedon Nov 8, 2025
So @davelynInes post (at the top of the thread) sparked my attention.
What we know is that setting up
Gestureis a very expensive operation, and it’s usually recommended touseMemothe gesture. ReanimatedSwipeable tries that, but after inspecting the code I can see thatonSwipeableOpenandonSwipeableCloseare directly passed as dependencies todispatchEndEventsanddispatchImmediateEvents, which are dependencies foranimateRow. Long story short, that simple prop causes the whole memoization chain to break, rendering every effort to memoize the Gesture useless. That’s the ugly and tricky part aboutuseCallbackanduseMemo: a single mistake is enough.You could try to pass a stable function to
onSwipeableOpenwithuseCallbackand see if that fixes the issue. If that doesn’t work,ReanimatedSwipeableitself should be wrapped withmemoon top of that. But ReanimatedSwipeable needs fully stable props to preventtapGesturefrom being re-created over and over again.I did not verify my findings, but I am pretty sure that this could be the culprit.
One more hint: if used with FlatList, which uses no recycling, using ReanimatedSwipeable is not recommended, as it will re-create the item every time, and the gesture setup is definitely expensive.
Use Flashlist, or better, LegendList
chocky335 commentedon Feb 21, 2026
We had the same performance issue with reanimated swipeable, so we created our own native swipeable with great performance. It's open source. You can find it here -> https://www.npmjs.com/package/react-native-swipeable-actions
ngocdevv commentedon Aug 22, 2026
Opened a fix for the inline-callback memoization break: #4466
onSwipeableOpen/onSwipeableClose(and the other event props) were in the worklet dependency chain, so a new function identity on each parent render reconfigured the native pan/tap handlers. The PR keeps those callbacks behind stable wrappers and adds a regression test.Keep ReanimatedSwipeable native handlers stable when event callbacks …
Keep ReanimatedSwipeable native handlers stable when event callbacks …