使用react-native-reanimated的Animated.useCode时iOS崩溃如何解决
崩溃原因
该问题是react-native-reanimated v1版本的已知缺陷,useCode的依赖项发生变更时,原生侧会重复初始化相关动画节点,过程中调用了未实现的OC方法,触发unrecognized selector崩溃。你代码中把onCloseBottomSheet、onFullScreen两个未做引用稳定处理的函数放到依赖项,组件每次重渲染都会生成新的函数引用,触发useCode重复执行,最终导致原生崩溃。
解决方案
- 优先做依赖项稳定处理:将两个回调函数用
useCallback包裹,确保引用不会随渲染随意变化,修改后的代码如下:
import { useCallback } from 'react' // 组件内先做回调的引用稳定 const stableOnClose = useCallback(() => { onCloseBottomSheet && onCloseBottomSheet() }, [onCloseBottomSheet]) const stableOnFullScreen = useCallback(() => { onFullScreen && onFullScreen() }, [onFullScreen]) Animated.useCode( () => Animated.onChange( callbackNode.current, Animated.block([ Animated.cond( Animated.greaterThan(callbackNode.current, 0), Animated.call([], () => { stableOnClose() }), ), Animated.cond( Animated.eq(callbackNode.current, 0), Animated.call([], () => { stableOnFullScreen() }), ), ]), ), [stableOnClose, stableOnFullScreen], );
- 若修改依赖后仍有崩溃,可直接将
useCode的依赖项数组改为空数组[],callbackNode是ref引用本身稳定,不会影响回调执行逻辑。 - 若你使用的是v1的旧版本,升级到v1最终稳定版
1.13.4即可修复该原生崩溃问题。 - 长期方案可升级到react-native-reanimated v2及以上版本,该版本已废弃
useCodeAPI,改用worklet语法实现同类逻辑,不存在该原生崩溃问题。
内容的提问来源于stack exchange,提问作者Qasem M. Zreaq
相关产品推荐
相关产品推荐

