【问题标题】:React Navigation - navigation.navigate() not navigating using top windowReact Navigation - navigation.navigate() 不使用顶部窗口导航
【发布时间】:2022-01-02 15:23:45
【问题描述】:

我在我的 React Native 项目中使用以下结构。

<NavigationContainer>
  <Stack.Navigator>
    <Stack.Screen name="Login" component={LoginScreen} />
    <Stack.Screen
      name="Home"
      component={HomeScreen}
      options={{
        headerRight: () => <SettingsButton />,
        presentation: 'modal',
      }}
    />
    <Stack.Screen
      name="Settings"
      component={SettingsScreen}
      options={{
        presentation: 'card',
      }}
    />
  </Stack.Navigator>
</NavigationContainer>

function SettingsButton() {
  const navigation = useNavigation();

  return (
    <Button 
      title="Settings" 
      onPress={() => navigation.navigate('Settings')} 
    />
  );
}

每当按下 SettingsButton 时,我想在主屏幕(前景窗口)而不是登录屏幕(背景/根窗口)上打开我的设置窗口。不幸的是,React Navigation 使用根窗口来推动屏幕并且发生了这种情况(注意后退按钮是如何出现在背景窗口上的):

我怎样才能让它使用前景窗口?

【问题讨论】:

  • 您作为主屏幕的模态和设置屏幕的卡片呈现。那么它只会看起来像这样..您的确切要求是什么?实际上你的问题有点令人困惑。
  • @Manojkanth 问题是导航推送不是发生在打开的模态屏幕上,而是发生在后台屏幕上。
  • 由于您的主屏幕处于模态,您是否尝试在推送您的卡片视图(设置屏幕)之前关闭您的模态。
  • 我认为你不能在模态框内推屏幕。如果你想在模态框上打开一个模态框,那么它是可能的。如果你想在 modal 中打开一个设置屏幕,那么你必须使用那个设置屏幕作为一个组件。
  • 是的...我以前遇到过类似的问题。

标签: react-native react-navigation react-navigation-stack


【解决方案1】:

注意:这里有一个单独的问题,可能会给您带来麻烦。我在下面添加了描述。

关于手头的问题,将堆栈传递给模态如何?

export const Root = () => {
    const RootStack = useMemo(() => createStackNavigator(), []);
    const HomeStack = useMemo(() => createStackNavigator(), []);

    function renderHomeStack() {
        return (
            <HomeStack.Navigator>
                <HomeStack.Screen name="Home" component={HomeScreen} />
                <HomeStack.Screen name="Settings" component={SettingsScreen} />
            </HomeStack.Navigator>
        );
    }

    function renderRootStack() {
        return (
            <RootStack.Navigator>
                <RootStack.Screen name="Login" component={LoginScreen} />
                <RootStack.Screen
                    name="HomeStack"
                    options={{
                        presentation: 'modal',
                    }}
                    component={renderHomeStack}
                />
            </RootStack.Navigator>
        );
    }

    return renderRootStack();
};

你可能会注意到 react-navigation 鼓励分离登录堆栈和主堆栈。你可以阅读更多关于它的信息here。如果不这样做,您可能会遇到多个问题,例如:

  1. 在 android 中阻止返回按钮以避免登录成功后返回登录页面。
  2. 使用navigate 重置导航状态以更轻松地导航到内页:
    navigation.navigate('Root', { screen: 'Profile' });
    
  3. 实施深度链接以根据推送通知进行导航。

最重要的是,实现navigation 是相当可观的 当堆栈分开时更容易。

【讨论】:

【解决方案2】:

您的主屏幕是modal,设置屏幕是card,您试图在模态屏幕内打开卡片屏幕,这是不可能的,您必须将设置设置为modal,所以它将弹出在主页顶部或将主页设置为card,因此它不会弹出在设置屏幕顶部。

【讨论】:

  • "所以它不会在设置屏幕顶部弹出。"你是说登录界面?
猜你喜欢
  • 1970-01-01
  • 2018-01-10
  • 2022-01-24
  • 2018-01-18
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
  • 2018-04-08
相关资源
最近更新 更多