react-native-reanimated: Animated.View does not update exiting/entering layout animations dynamically
Description
Changing exiting or entering properties on an animated component doesn’t have an effect.
Since createAnimatedView only ever registers entering or exiting animations during _setComponentRef, updates to exiting and entering don’t ever take effect (i.e. componentDidUpdate in animated components doesn’t ever re-register exiting and entering via LayoutAnimationRepository.registerConfig).
I tried the obvious “fix,” which was to call registerConfig with an updated exiting/entering during componentDidUpdate, but that led to a crash. I’m likely misunderstanding the threading/data-usage of configurations once registered. The real fix would be to update registered configurations with new layout animations whenever those properties change.
Steps to reproduce
- Create an
Animated.Viewwithexiting={LightSpeedOutLeft}, andkey={42} - Dynamically update its
exitingtoLightSpeedOutRight. Make sure component renders before next step. - Change
keyto"Thank you very much, Mr. Roboto". Once again, this step should only be taken AFTER step 2 has rendered, or else you’ll simply be setting a different animation on a new view.
RESULT: View animates out left. EXPECTED: View animates out right.
Snack or a link to a repository
https://snack.expo.dev/@fivecar/reanimated2-layout-animations-not-updating
Reanimated version
2.10.0
React Native version
0.69.3
Platforms
iOS
JavaScript runtime
JSC
Workflow
React Native (without Expo)
Architecture
Paper (Old Architecture)
Build type
Debug mode
Device
iOS simulator
Device model
No response
Acknowledgements
Yes
About this issue
- Original URL
- State: closed
- Created 2 years ago
- Reactions: 5
- Comments: 17 (3 by maintainers)
I encountered the same problem and found a workaround using a custom animation as described here: https://docs.swmansion.com/react-native-reanimated/docs/api/LayoutAnimations/customAnimations#custom-exiting-animation
In my case I want to set the exit animation to either
SlideOutLeftorSlideOutRightdepending on which way the view was swiped. My solution looks something like this:The example by @bviebahn is the correct way to do this, using shared values and the animation builder. The example even extends a reanimated preset which is great for people looking for a copy paste solution. Great contribution!
This works great give this a try if you’re trying to do some dynamic animations based on a react state and change out that state for useSharedValue. Thank you !!!