带有反应导航 5 的 switchNavigator

sin*_*spk 8 reactjs react-native react-navigation react-navigation-v5

使用 react-navigation 4,我能够从“react-navigation”包中导入和使用 switchNavigator。

import {
  createAppContainer,
  createSwitchNavigator,
  createStackNavigator
} from "react-navigation";

import MainTabNavigator from "./MainTabNavigator";
import LoginScreen from "../screens/LoginScreen";
import AuthLoadingScreen from "../screens/AuthLoadingScreen";

export default createAppContainer(
  createSwitchNavigator(
    {
      App: MainTabNavigator,
      Auth: AuthLoadingScreen,
      Login: createStackNavigator({ Login: LoginScreen })
    },

    {
      initialRouteName: "Auth"
    }
  )
);
Run Code Online (Sandbox Code Playgroud)

使用 react-navigation 5,我在包中看不到 createSwitchNavigator 了。该文档也没有帮助。现在不推荐使用吗?我的用例是在用户登录之前显示登录屏幕,并在用户登录后切换到应用程序。 React-navigation 给出了一个身份验证流程的例子,但是否可以使用 switchNavigator - 这似乎更简单。

mle*_*ter 18

switchNavigator 已被删除,因为您现在可以在有条件地呈现组件的帮助下完成完全相同的工作。

import React from 'react';
import {useSelector} from "react-redux";
import {NavigationContainer} from "@react-navigation/native";

import { AuthNavigator, MyCustomNavigator } from "./MyCustomNavigator";

const AppNavigator = props => {
    const isAuth = useSelector(state => !!state.auth.access_token);

    return (
        <NavigationContainer>
            { isAuth && <MyCustomNavigator/>}
            { !isAuth && <AuthNavigator/>}
        </NavigationContainer>
    );
};
export default AppNavigator;
Run Code Online (Sandbox Code Playgroud)

NavigationContainer 内的行完全取代了旧的 switch navigator。

  • 那么我们以后如何从“LoginScreen”(在 **AuthNavigator** 内)导航到“HomeScreen”(在 **MyCustomNavigator** 内)? (5认同)
  • 我很困惑如何结合“redux”、“asyncStorage”和“reactnavigation v5”来保存登录详细信息,所有教程都是旧的,您看过任何新教程吗? (3认同)
  • @mleister 同意。但这种新模式带来了以下限制:1. 对现有代码进行重大重构(imo)几乎没有任何好处,2. 将导航功能的关注点与授权(以及任何相关功能)的关注点合并,3. 删除一层在与其他状态容器(如 redux)一起工作时有用的抽象。 (2认同)

cha*_*lvi 5

我也使用了 Navigator 4 的 SwitchNavigator 然后在将其他页面迁移到 Navigator 5 之后,我尝试将身份验证部分移动到 Navigator 5。我无法使用 Navigator 5 实现 SwitchNavigator 功能。然后决定使用 Navigation API 5 中提供的“兼容层” . https://reactnavigation.org/docs/compatibility/
希望下面的代码对你有用。

import { createStackNavigator } from '@react-navigation/stack'
import { NavigationContainer } from '@react-navigation/native';
import { createSwitchNavigator } from "@react-navigation/compat";
import { createCompatNavigatorFactory } from '@react-navigation/compat'
 const AppStack = createCompatNavigatorFactory(createStackNavigator)(
      { screen: Home },
      {headerMode:'none'}
 );
 const AuthStack = createCompatNavigatorFactory(createStackNavigator)({ screen:Login });
const SwitchNavigator= createSwitchNavigator(
      {
    Starter: AuthValidation,
    App: AppStack,
    Auth: AuthStack
  },
  {
    initialRouteName:'Starter'
  }
);
export default function App (){
  
    return(
      <NavigationContainer>
          <SwitchNavigator/>
      </NavigationContainer>
    );
}
Run Code Online (Sandbox Code Playgroud)
这里 AuthValidation 验证令牌并根据值导航到“登录”或“主页”页面
_checkAuthetication = async() =>{
  const isUserAuthenticated= await AsyncStorage.getItem("isAuthenticated");
  this.props.navigation.navigate(isUserAuthenticated ? 'App':'Auth');
}
Run Code Online (Sandbox Code Playgroud)