Where is placed createSwitchNavigator in react-navigation 5.x for migrating from react-navigation 4 to 5.x

Sir*_*iaz 6 reactjs react-native react-navigation react-navigation-v5

I'm migrating a React Native application from react-navigation 4 to 5.x and i can't find which package contains createSwitchNavigation. Specifically i have doubts with the auth token check part.

With react-navigation 4 i had:

const switchNavigator = createSwitchNavigator({
  ResolveAuth: ResolveAuthScreen,
  signinFlow: createStackNavigator({
    Signup: SignupScreen,
    Signin: SigninScreen,
  }),
  appFlow: createBottomTabNavigator({
    TrackCreate: TrackCreateScreen,
    trackListFlow: createStackNavigator({
      TrackList: TrackListScreen,
      TrackDetail: TrackDetailScreen
    }),
    Account: AccountScreen,
  })
}, {
  initialRouteName: 'ResolveAuth'
});
Run Code Online (Sandbox Code Playgroud)

然后我有一个包含 ResolveAuthScreen 组件的文件。

import React, { useEffect } from 'react';
import { connect } from 'react-redux';

const ResolveAuthScreen = (props) => {
  useEffect(() => {
    if (!props.token) {
      props.navigation.navigate('loginFlow');
    } else {
      props.navigation.navigate('TrackList');
    }
  }, []);

  return null;
};

const mapStateToProps = (state) => {
  return {
    token: state.auth.token,
  };
};

export default connect(mapStateToProps, null)(ResolveAuthScreen);
Run Code Online (Sandbox Code Playgroud)

其余组件对于这个疑问并不重要。我想知道如何复制相同的 Switch 导航流程。我想知道如何创建这样的东西:

const Switch = createSwitchNavigator();

export default function App() {
  return (
    <NavigationContainer>
      <Switch.Navigator>
        <Switch.Screen name="ResolveAuth" component={ResolveAuthScreen} />
        <Switch.Screen name="signinFlow" component={SignInFlowScreens} />
        <Switch.Screen name="appFlow" component={AppFlowScreens} />
      </Switch.Navigator>
    </NavigationContainer>
  );
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*tko 10

为了使迁移更容易,您仍然可以使用createSwitchNavigatorfrom@react-navigation/compat


Moh*_*h75 4

在 React Navigation 的早期版本中,有两种方法来处理这个问题:

  1. 保留多个导航器,并在登录时使用切换导航器将活动导航器切换到另一个导航器(推荐)
  2. 登录后将导航器的状态重置为所需的屏幕

但对于 v5,您需要使用上下文。看看这里,看看详细的例子!

  • 这与上下文无关,而是条件定义:“我们将在本指南中使用 React.useReducer 和 React.useContext。但是如果您使用的是 Redux 或 Mobx 等状态管理库” (2认同)