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

React Native登录后跳转Dashboard失败问题求助

问题描述

在React Native中实现登录成功后,将token存入AsyncStorage并跳转到Dashboard页面。目前token已成功存入,但跳转失败,报错:

"The action 'NAVIGATE' with payload {} was not handled by any navigator. You need to pass the name of the screen to navigate to."

相关代码如下:

App.js

const ApplicationNavigator = () => {
  const { Layout, darkMode, NavigationTheme } = useTheme()
  const { colors } = NavigationTheme
console.log("app.js")
let token;
AsyncStorage.getItem('token')
.then((value) => {
   token = JSON.parse(value);
  console.log('token is ', token);
});

  return (
    <SafeAreaView style={[Layout.fill, { backgroundColor: colors.card }]}>
      <NavigationContainer theme={NavigationTheme} ref={navigationRef}>
        {!token && <AuthStack/>}
       {token && <MainStack/>}
      </NavigationContainer>
    </SafeAreaView>
  )
}

export default ApplicationNavigator

AuthStack

const AuthStack = () => {
  return (
    <Stack.Navigator
      initialRouteName="LoginScreen"
      screenOptions={{
        headerShown: false,
      }}
    >
      <Stack.Screen name="LoginScreen" component={LoginScreen} />
    </Stack.Navigator>
  );
};

MainStack

<Tab.Navigator >
      <Tab.Screen name='Dashboard' component={Dashboard} />
      <Tab.Screen name='My Tasks' component={MyTaskStack} />
      <Tab.Screen name='Job Openings' component={JobOpeningsStack} />
      <Tab.Screen name='Candidates' component={CandidateStack} />
    </Tab.Navigator>

Login组件的signIn方法

const signIn = () => {
   let body={
    email:email,
    Password:password
   }
   console.log(body)
    fetch("http://testApplication/login", {
      method: "POST",
      headers: {
        Accept: "application/json",
        "Content-Type": "application/json",
      },
      body: JSON.stringify(body),
    })
      .then((response) => response.json())
      .then((responseJson) => {
        console.log(responseJson)
      
       AsyncStorage.setItem("token", responseJson.token)
      .then(() => {
        console.log('data stored..');
      });
       let token =  AsyncStorage.getItem("token");
       console.log(token)
       
        navigation.navigate("Dashboard")
        
      });
};

需要修改的部分

1. 修复App.js中token状态的异步更新问题

AsyncStorage.getItem是异步操作,初始渲染时token变量还是undefined,导致App.js只会渲染AuthStack,登录后也不会自动切换到MainStack。需要用useState和useEffect管理token状态,实现响应式更新:

修改后的App.js:

import { useState, useEffect } from 'react';

const ApplicationNavigator = () => {
  const { Layout, darkMode, NavigationTheme } = useTheme()
  const { colors } = NavigationTheme
  const [token, setToken] = useState(null);

  useEffect(() => {
    const getToken = async () => {
      const value = await AsyncStorage.getItem('token');
      setToken(JSON.parse(value));
      console.log('token is ', JSON.parse(value));
    };
    getToken();
  }, []);

  return (
    <SafeAreaView style={[Layout.fill, { backgroundColor: colors.card }]}>
      <NavigationContainer theme={NavigationTheme} ref={navigationRef}>
        {!token && <AuthStack/>}
        {token && <MainStack/>}
      </NavigationContainer>
    </SafeAreaView>
  )
}

export default ApplicationNavigator

2. 修复登录时的导航跳转逻辑

登录时当前处于AuthStack导航器中,而Dashboard属于MainStack,直接调用navigation.navigate("Dashboard")会失败,因为当前导航器没有这个页面。需要在登录成功后触发App.js重新渲染切换到MainStack,同时重置导航栈避免返回登录页:

修改后的Login组件signIn方法:

// 先确保已定义全局导航ref
import { navigationRef } from './App';

const signIn = async () => {
  const body = {
    email: email,
    Password: password
  };
  console.log(body);

  try {
    const response = await fetch("http://testApplication/login", {
      method: "POST",
      headers: {
        Accept: "application/json",
        "Content-Type": "application/json",
      },
      body: JSON.stringify(body),
    });
    const responseJson = await response.json();
    console.log(responseJson);

    // 存入token
    await AsyncStorage.setItem("token", responseJson.token);
    console.log('data stored..');

    // 重新获取token并更新App.js的状态
    const newToken = await AsyncStorage.getItem("token");
    setToken(JSON.parse(newToken)); // 如果Login组件能访问App的token状态,否则用下面的reset方法

    // 用全局导航ref重置到MainStack的Dashboard
    if (navigationRef.isReady()) {
      navigationRef.reset({
        index: 0,
        routes: [{ name: 'Dashboard' }],
      });
    }
  } catch (error) {
    console.error('登录失败:', error);
  }
};

全局导航ref定义(在App.js或单独文件):

import { createNavigationContainerRef } from '@react-navigation/native';
export const navigationRef = createNavigationContainerRef();

3. 修复AsyncStorage.getItem的异步调用问题

原代码中let token = AsyncStorage.getItem("token");会返回Promise而非实际token值,需用await处理,上述修改已包含此修复。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:01:06