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

Stack.Navigator与ScrollView问题:返回首页丢失滚动位置

问题描述

首页使用ScrollView后出现以下问题:用户向下滚动几次后点击条目进入新页面,在该页面再次点击条目跳转到其他页面,连续返回两次回到首页时,页面会回到顶部,而非之前离开的滚动位置。推测该问题与Stack.Navigator的层级堆叠机制有关,但不知如何修复。

现有Stack.Navigator配置代码
const UserIsSignedIn = () => {
  
  const navigation = useNavigation();
  const Stack = createSharedElementStackNavigator();
 
  return (
      <Stack.Navigator
        screenOptions={{
        headerShown: false
        }}
      >

      {/* Bottom Tabs */}
      <Stack.Screen name={name}  component= {MyTabs} options={{headerShown: false}}/>
      
    
       //Popular now section (Screen 1)
      <Stack.Screen name= 'PopularNow' component={PopularNow}/>      
      
      //Game Preview Screen (Screen 2)
      <Stack.Screen 
      name="GamePreview" 
      component={GamePreviewScreen}
      
      sharedElements={(route, otherRoute, showing) => {
        if (otherRoute.name === 'GameDetails') {
          return [
           {
            
           }
          ]
        }
        const { item } = route.params;
          return [
            {
            id: `item.${item.id}.game`,
            animation: 'move',
            resize: 'clip',
        // align: ''left-top'
        },
      ];
      }}
      />

      //Game Details (Screen 3)
      <Stack.Screen name='GameDetails' component={GameDetails}/>

      </Stack.Navigator>
  
  )
}

export default UserIsSignedIn;
修复方案

核心原因

问题本质是首页(MyTabs)在Stack栈中被重新挂载:当从GameDetails返回GamePreview,再返回MyTabs时,Stack可能会销毁并重建MyTabs实例,导致ScrollView的滚动状态丢失。

具体修复步骤

  1. 阻止Tab页面被卸载
    在MyTabs对应的Stack.Screen配置中添加unmountOnBlur: false,让页面在离开时保持挂载状态,滚动自然保留:
<Stack.Screen 
  name={name}  
  component={MyTabs} 
  options={{
    headerShown: false,
    unmountOnBlur: false // 关键配置:离开时不卸载页面
  }}
/>
  1. 手动保存/恢复滚动位置(备选方案)
    如果上述方法不生效,可手动管理滚动状态:
import { ScrollView, useFocusEffect } from '@react-navigation/native';
import React, { useRef, useState } from 'react';

const HomeScreen = () => {
  const scrollRef = useRef(null);
  const [scrollY, setScrollY] = useState(0);

  // 实时保存滚动位置
  const handleScroll = (event) => {
    setScrollY(event.nativeEvent.contentOffset.y);
  };

  // 页面重新获得焦点时恢复滚动位置
  useFocusEffect(
    React.useCallback(() => {
      scrollRef.current?.scrollTo({
        y: scrollY,
        animated: false
      });
    }, [scrollY])
  );

  return (
    <ScrollView
      ref={scrollRef}
      onScroll={handleScroll}
      scrollEventThrottle={16} // 确保滚动位置实时更新
    >
      {/* 页面内容 */}
    </ScrollView>
  );
};
  1. 检查导航跳转逻辑
    避免在页面跳转时使用navigation.reset或replace等清空栈的方法,确保返回操作是正常的栈弹出行为,防止首页实例被意外重置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 00:55:17