【问题标题】:Unable to navigate to drawer stack in react navigation 5无法在反应导航 5 中导航到抽屉堆栈
【发布时间】:2020-09-03 04:01:11
【问题描述】:

我有一个应用程序,它在抽屉导航器内有一个底部选项卡导航器作为我的主屏幕,我还有一个堆栈导航器,其中包含我的身份验证屏幕(包括登录屏幕)。

成功登录后,我无法从登录屏幕导航到主堆栈屏幕。 我收到错误消息 - 任何导航器都未处理使用有效负载导航的操作。

请看我的代码。我该如何解决这个问题

导航文件 - Navigation.js

const MainTabScreen = () => (
    <Tab.Navigator
      initialRouteName="Main"
      activeColor="#fff"
    >
      <Tab.Screen
        name="Main"
        component={Main}
        options={{
          tabBarLabel: 'Home',
          tabBarColor: "#009387",
          tabBarIcon: ({ color }) => (
            <Icon name="md-home" color={color} size={26} />
          ),
        }}
      />
      <Tab.Screen
        name="Profile"
        component={ProfileScreen}
        options={{
          tabBarLabel: 'Profile',
          tabBarColor: "#694fad",
          tabBarIcon: ({ color }) => (
            <Icon name="md-contact" color={color} size={26} />
          ),
        }}
      />
      <Tab.Screen
        name="Explore"
        component={ExploreScreen}
        options={{
          tabBarLabel: 'Account',
          tabBarColor: "#d02860",
          tabBarIcon: ({ color }) => (
            <Icon name="md-planet" color={color} size={26} />
          ),
        }}
      />
    </Tab.Navigator>
)



// HOME STACK SCREEN   
const DrawerScreen = () => (
  <Drawer.Navigator drawerContent={props => <DrawerContent {...props} /> } >
  <Drawer.Screen name='MainTab' component={MainTabScreen} />
  </Drawer.Navigator>
);

const AuthStack = createStackNavigator();

const AuthStackScreen = ({navigation}) => (
    <AuthStack.Navigator headerMode='none'>
        <AuthStack.Screen name="SplashScreen" component={SplashScreen} />
        <AuthStack.Screen name="SignInScreen" component={SignInScreen} /> // LOGIN SCREEN
        <AuthStack.Screen name="SignUpScreen" component={SignUpScreen} />
    </AuthStack.Navigator>
);

const RootStack = createStackNavigator();
const RootStackScreen = () => {


  const [isLoading, setIsLoading] = React.useState(true);
  const [user, setUser] = React.useState(null);

  React.useEffect(() => {
    // Fetch the token from storage then navigate to our appropriate place
    const bootstrapAsync = async () => {
      let userToken;

      try {
        userToken = await AsyncStorage.getItem('FBIdToken');
        console.log("toen", userToken)
        if(userToken !== null) {
          setIsLoading(!isLoading);
          setUser(userToken);
        } else {
          setIsLoading(!isLoading);
        }
      } catch (e) {
        console.log(error)
      }

      // After restoring token, we may need to validate it in production apps
    };

    bootstrapAsync();
  }, []);


  return (
    <RootStack.Navigator
      headerMode="none"
      screenOptions={{ animationEnabled: false }}
      mode="modal"
    >
      {isLoading ? (
        <RootStack.Screen name="Loading" component={LoadingScreen} />
      ) : user ? (
        <RootStack.Screen name="DrawerScreen" component={DrawerScreen} /> //HOME STACK          ) : (
        <RootStack.Screen name="AuthStackScreen" component={AuthStackScreen} />
      )}
    </RootStack.Navigator>
  );
};

export default RootStackScreen;

App.js

  <Provider store={store}>
        <NavigationContainer ref={navigationRef}>
      <RootStackScreen />
    </NavigationContainer>
   </Provider> 

登录.js

  loginHandle = () => {

        this.props.navigation.navigate("DrawerScreen")
    };

【问题讨论】:

  • 您能否提供一个最小的生殖样本,以便我们进行研究? (小吃博览会将是完美的)。我不知道这里有什么问题

标签: reactjs react-native react-native-android react-navigation react-navigation-v5


【解决方案1】:

我怀疑在您的 RootStackScreen 组件中,您的条件 isLoading 为真,因此当您导航时,到您的 DrawerScreen 的路线不存在。尝试删除条件以确保。然后,如果这是原因,您可以尝试将您的条件应用于您传递给DrawerScreen 的组件,例如:

&lt;RootStack.Screen name="DrawerScreen" component={isLoading ? LoadingScreen : DrawerScreen} /&gt;

【讨论】:

  • 嗨,我删除了正在加载,它仍然无法正常工作..您还有什么建议?
  • @biggest_boy 请尝试导航到MainTab,而不是DrawerScreen by:this.props.navigation.navigate("MainTab")
  • 我试过 MainTab,它不工作。我只能导航到与登录屏幕在同一堆栈中的注册和加载屏幕
  • 或者我应该将身份验证屏幕与其他屏幕包含在同一个堆栈中吗?这行得通,但我认为这是正确的做法
  • 我不能让你的零食工作,但建议限制嵌套导航器,所以我认为将你的 authNavigator 与 rootNavigator 合并不是一个坏主意。您的抽屉导航器也有同样的想法。我在本机反应方面没有太多经验,但是有一个调用另一个堆栈(以及调用抽屉的抽屉)的堆栈对我来说听起来很奇怪。此外,一个简单的上下文或状态或任何您想要的内容都可以帮助您管理您的路线,就像您使用“isLoading”一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 2022-08-21
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多