You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:54:01