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

Expo Router SDK50集成Drawer遇Reanimated版本匹配错误求助

Expo Router SDK 50 集成 Drawer 组件报错及动画失效解决方案

问题描述

使用Expo Router(SDK 50)开发应用时集成Drawer组件,按官方文档安装react-native-gesture-handler和react-native-reanimated后,出现错误提示:Reanimated: Couldn't determine the version of the native part of Reanimated,且动画无法正常运行。已尝试npm install、清除缓存、npx expo start --clear、run:android等操作,均未解决。旧版本中使用以下封装代码可正常运行:

const DrawerSceneWrapper = ({ children }) => {
  const progress = useDrawerProgress();
  const animatedStyle = useAnimatedStyle(() => ({
    transform: [
      { scale: interpolate(progress.value, [0, 1], [1, 0.8], "clamp") },
      {
        rotateY: `${interpolate(progress.value, [0, 1], [0, -10], "clamp")}deg`,
      },
      { translateX: interpolate(progress.value, [0, 1], [0, 0, -60], "clamp") },
    ],
    borderRadius: interpolate(progress.value, [0, 1], [0, 28], "clamp"),
    overflow: "hidden",
  }));
  return (
    <Animated.View className="flex-1" style={animatedStyle}>
      {children}
    </Animated.View>
  );
};

解决方案

1. 匹配SDK对应依赖版本

SDK 50要求react-native-reanimated版本为3.6.2,react-native-gesture-handler版本为2.14.0,执行以下命令安装指定版本:

npm install react-native-reanimated@3.6.2 react-native-gesture-handler@2.14.0

2. 配置babel插件顺序

在项目根目录的babel.config.js中,确保react-native-reanimated/plugin是最后一个插件:

module.exports = function(api) {
  api.cache(true);
  return {
    presets: ['babel-preset-expo'],
    plugins: [
      // 其他插件放在前面
      'react-native-reanimated/plugin',
    ],
  };
};

3. 适配Reanimated 3.x API

Reanimated 3.x已弃用旧版interpolate的字符串参数格式,需替换为配置对象,同时修正无效的插值参数。修改后的代码:

import { useDrawerProgress } from '@react-navigation/drawer';
import { interpolate, useAnimatedStyle, Animated } from 'react-native-reanimated';

const DrawerSceneWrapper = ({ children }) => {
  const progress = useDrawerProgress();
  const animatedStyle = useAnimatedStyle(() => ({
    transform: [
      { scale: interpolate(progress.value, [0, 1], [1, 0.8], { extrapolateRight: 'clamp' }) },
      {
        rotateY: `${interpolate(progress.value, [0, 1], [0, -10], { extrapolateRight: 'clamp' })}deg`,
      },
      { translateX: interpolate(progress.value, [0, 1], [0, -60], { extrapolateRight: 'clamp' }) },
    ],
    borderRadius: interpolate(progress.value, [0, 1], [0, 28], { extrapolateRight: 'clamp' }),
    overflow: "hidden",
  }));
  return (
    <Animated.View className="flex-1" style={animatedStyle}>
      {children}
    </Animated.View>
  );
};

注:原代码中translateX的插值数组[0,0,-60]无效,已修正为[0,-60],确保输入输出数组长度一致。

4. 彻底清除缓存并重构

执行以下命令清除所有缓存并重新构建原生项目:

npx expo prebuild --clean
npx expo start --clear
npx expo run:android

5. 确认Gesture Handler入口配置

在项目入口文件(如app/_layout.js)的最顶部导入react-native-gesture-handler:

import 'react-native-gesture-handler';

内容的提问来源于stack exchange,提问作者Daniel Alanaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 20:30:18