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

React Reanimated共享元素导航过渡异常问题求助

React Expo 共享元素过渡异常修复方案

问题概述

使用以下依赖栈开发的React Expo应用:

"dependencies": {
    "@babel/plugin-proposal-export-namespace-from": "^7.18.9",
    "@expo/metro-runtime": "~3.1.3",
    "@react-navigation/native": "^6.1.9",
    "@react-navigation/native-stack": "^6.9.17",
    "expo": "~50.0.6",
    "expo-status-bar": "~1.11.1",
    "react": "18.2.0",
    "react-dom": "18.2.0",
    "react-native": "0.73.4",
    "react-native-reanimated": "~3.6.2",
    "react-native-web": "~0.19.6",
    "expo-image": "~1.10.6"
  },

导航栈配置及页面图片组件如下:

const Stack = createNativeStackNavigator();

export default function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator>
        <Stack.Screen name="Home" component={Homescreen} />
        <Stack.Screen name="About" component={AboutScreen} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}
<Animated.Image source={require("./assets/adaptive-icon.png")} style={styles.image} sharedTransitionTag="tag" />

出现以下异常:

  • Home → About 无共享元素过渡效果
  • About → Home 时图片先移至左上角再消失,动画异常

修复步骤

1. 替换Animated.Image为expo-image组件

React Navigation的共享元素过渡仅对expo-image的Image组件提供完整支持,原生Animated.Image不兼容sharedTransitionTag属性,这是导致跳转无动画的核心原因。

修改页面中的图片组件:

import { Image } from 'expo-image';

// 替换原Animated.Image
<Image 
  source={require("./assets/adaptive-icon.png")} 
  style={styles.image} 
  sharedTransitionTag="tag" 
/>

2. 配置导航栈的共享元素规则

在Stack.Screen中明确指定参与过渡的共享标签,确保动画上下文正确传递:

const Stack = createNativeStackNavigator();

export default function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator>
        <Stack.Screen 
          name="Home" 
          component={Homescreen} 
          options={{
            sharedElements: () => ['tag']
          }}
        />
        <Stack.Screen 
          name="About" 
          component={AboutScreen} 
          options={{
            sharedElements: () => ['tag']
          }}
        />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

注:sharedElements返回的数组需包含两个页面中一致的sharedTransitionTag值。

3. 校验Reanimated Babel配置

共享过渡依赖react-native-reanimated,确保babel.config.js中已添加其插件,且顺序正确:

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

修改后必须重启Metro服务,避免缓存导致配置不生效。

4. 统一页面图片样式

两个页面中图片的基础样式(宽高、resizeMode等)需保持一致,样式突变会导致返回时出现偏移异常:

// 确保Home和About页面的styles.image完全一致
const styles = StyleSheet.create({
  image: {
    width: 100,
    height: 100,
    resizeMode: 'contain'
  }
});

验证

完成上述修改后,重启Metro并重新运行应用,即可看到正常的共享元素过渡效果:

  • Home → About:图片平滑过渡到目标位置
  • About → Home:图片从当前位置返回至Home页面的初始位置,无偏移消失现象

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:44:55