如何在使用 StackNavigator 登录后更新 React Native Expo 中的主屏幕

问题描述 投票:0回答:1

我正在 React Native Expo 中开发我的第一个应用程序,我已经取得了很多进展,但目前当用户登录并正确验证数据但屏幕没有改变时我遇到了问题。你能帮我一下吗?

这是我的 StackNavigator 的代码

const Stack = createStackNavigator();

const StackNavigator = () => {

const [isLoggedIn, setIsLoggedIn] = useState(false);
const [isLoading, setIsLoading] = useState(false);

useEffect(() => {
    const checkLoginStatus = async () => {
      try {
        let token = await AsyncStorage.getItem("token");
        setIsLoggedIn(!!token);

        if (isLoggedIn) {
          setIsLoading(true);
          // Refresh your app data here (e.g., fetch user details, cart items, etc.)
          await doAsyncRefresh();
          setIsLoading(false);
        }
      } catch (err) {
        setIsLoggedIn(false);
      }
    };

    checkLoginStatus();
  }, []);

return (
    <Stack.Navigator>
      {isLoggedIn ? (
        <>
          <Stack.Screen name="Inicio" component={BottomTabNavigator} options={{headerShown: false}}/>
          <Stack.Screen name="Order" component={OrderScreen} 
            options={{
              title: 'Realiza tu pedido'
            }}
          />

          <Stack.Screen name="Detalle" component={ProductDetailScreen} 
            options={{
              title: 'Información del producto'
            }}
          />
          <Stack.Screen name="Home" component={HomeSreen} />
          <Stack.Screen name="Orders" component={OrderDetailScreen} 
            options={{
              title: 'Historial de pedidos'
            }}
          />
          <Stack.Screen name="DatosFacturacion" component={InvoiceDataScreen} 
            options={{
              title: 'Datos de facturación'
            }}
          />
          <Stack.Screen name="ProductosPorCategoria" component={ShowPerCategoryListScreen} 
            options={{
              title: 'Productos por categoria'
            }}
          />
          <Stack.Screen name="Confirmation" component={ConfirmationOrderScreen} 
            options={{headerShown: false}}
          />
        </>
      ) : (
        <>
          <Stack.Screen name="Login" component={LoginScreen} />
        </>
      )}
    </Stack.Navigator>
);

}

导出默认StackNavigator;

这是我在 AuthContext 中登录的代码

常量登录=异步(电子邮件,密码)=> {

setIsLoading(true);

try {
    
    // Send the login request to the API
    const response = await axios.post('https://ecommerce.comercializadoramya.com/api/v1/login', {
      email,
      password,
      device_name: 'Mobile'
    });

    if(response.data.success){
        const token = response.data.token;
        const user_info = response.data.user;

        await AsyncStorage.setItem('token', token);
        await AsyncStorage.setItem('user_info', JSON.stringify(user_info));

        setUserInfo(user_info);
        console.log(user_info);
        console.log(token);

        await isLoggedIn(true);

    }else{
       setErrorMessage(response.data.message);
    } 

  } catch (error) {

    if (error.response.status === 401) {
      setErrorMessage('La contraseña es incorrecta por favor intenta nuevamente');
    } else if (error.response.status === 404) {
      setErrorMessage('No existe un usuario con este correo electrónico');
    } else {
      setErrorMessage('Ha ocurrido un error. Intenta nuevamente.');
    }

    // Handle error using error handling tools or custom logic
    setErrorMessage(error.message);
  }

  setIsLoading(false);

};

reactjs react-native expo react-navigation react-navigation-bottom-tab
1个回答
0
投票

让我展示一下登录后如何管理我的导航器。

这里你需要管理两个堆栈导航器。我建议您将堆栈导航器更改为两个堆栈。例如

AuthStack
AppStack

Authstack.js

    
const Authstack= ()=>{

    const Stack = createNativeStackNavigator();
  
    return(
        <Stack.Navigator initialRouteName='Login'>
            <Stack.Screen name="Login" component={Login}  />
        </Stack.Navigator>
        
    );
}
export default Authstack

AppStack.js

const AppStack= ()=>{

    const Stack = createNativeStackNavigator();
  
    return(
        <Stack.Navigator >
            <Stack.Screen name="Inicio" component={BottomTabNavigator}   />
            <Stack.Screen name="Order" component={OrderScreen} 
            options={{
              title: 'Realiza tu pedido'
            }}
          />

          <Stack.Screen name="Detalle" component={ProductDetailScreen} 
            options={{
              title: 'Información del producto'
            }}
          />
          <Stack.Screen name="Home" component={HomeSreen} />
          <Stack.Screen name="Orders" component={OrderDetailScreen} 
            options={{
              title: 'Historial de pedidos'
            }}
          />
          <Stack.Screen name="DatosFacturacion" component={InvoiceDataScreen} 
            options={{
              title: 'Datos de facturación'
            }}
          />
          <Stack.Screen name="ProductosPorCategoria" component={ShowPerCategoryListScreen} 
            options={{
              title: 'Productos por categoria'
            }}
          />
          <Stack.Screen name="Confirmation" component={ConfirmationOrderScreen} 
            options={{headerShown: false}}
          />
        </Stack.Navigator>
        
    );
}

export default AppStack

然后您需要使用

useContext
钩子来管理日志记录。上下文是全局管理状态的一种方式。

请参阅 https://react.dev/reference/react/useContext 了解更多信息。

LoginProvider.js

    
import React,{ createContext, useContext, useState, useEffect} from 'react'
import AsyncStorage from '@react-native-async-storage/async-storage';


const LoginContext = createContext();

const LoginProvider = ({children}) => {
    const [isLoggedIn, setIsLoggedIn] = useState(false);

    useEffect(async()=>{
        const token= await AsyncStorage.getItem('token')
        (token ? setIsLoggedIn(true) : setIsLoggedIn(false))
      },[])

  return (
    <LoginContext.Provider value={{isLoggedIn, setIsLoggedIn}}>
        {children}
    </LoginContext.Provider>
  )
}

export const useLogin = () => useContext(LoginContext)


export default LoginProvider

然后你可以使用LoginProvider来管理你的登录状态

路线.js

import React, { useEffect, useState } from 'react';
import { NavigationContainer} from '@react-navigation/native';
import 'react-native-gesture-handler';

import AuthStack from './Authstack';
import AppStack from './Appstack';
import { useLogin } from './LoginProvider';


function Route() {

  const {isLoggedIn, setIsLoggedIn} = useLogin()

    return (
      <NavigationContainer  >
          {(isLoggedIn ? <AppStack/> : <AuthStack/>) }
      </NavigationContainer>
    );
  }

  export default Route;

希望您能通过上面的例子有所了解。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.