当退出我的应用程序signin screen is getting rendered twice.只有当我导航到另一个屏幕,然后返回initialroute时,才会发生这种情况.如果我没有在登录和注销后立即离开initialroute,它只会呈现一次.但一旦我开始在应用程序中导航,然后注销,登录屏幕就会呈现两次.
我正在使用redux和asyncstorage来处理我的应用程序中的身份验证流.我只发现一个人有相同的问题,他通过使用SwitchNavigator而不是StackNavigator解决了问题,如图here所示,但SwitchNavigator已在React Navigation 6中删除,我无法找到解决方案,因此感谢所有帮助.
redux reducer for the user.js
import {UPDATE_USER} from '../actions/actionTypes';
const initialState = {
userdata: {},
loginStatus: -1, // -1 == loading, 0 = not logged in, 1 == logged in
};
const updateUser = (state, action) => {
let ud = action.userdata;
return {...state, userdata: Object.assign({}, ud), loginStatus: ud ? 1 : 0};
};
const userReducer = (state = initialState, action) => {
switch (action.type) {
case UPDATE_USER:
return updateUser(state, action);
default:
return state;
}
};
export default userReducer;
Loading screen.js
import React, {useEffect, useState, useRef} from 'react';
//ThirdParty
//import CustomSplashScreen from 'react-native-splash-screen';
import AsyncStorage from '@react-native-async-storage/async-storage';
import {NavigationContainer} from '@react-navigation/native';
//Redux
import {updateUser} from '../../redux/actions/userActions';
import {useSelector} from 'react-redux';
import {useDispatch} from 'react-redux';
//Import STACK NAVIGATORS
import AuthNavigator from '../../navigator/AuthNavigator';
import MainNavigator from '../../navigator/MainNavigator';
function LoadingScreen() {
const ref = useRef();
const loginStatus = useSelector((state) => state.user.loginStatus);
const dispatch = useDispatch();
useEffect(() => {
console.log('loginStatus', loginStatus);
async function getAsyncData() {
let data = await AsyncStorage.getItem('data');
let dataParsed = JSON.parse(data);
console.log("AsyncData: "+data);
//Update redux state
dispatch(updateUser(dataParsed));
}
getAsyncData();
});
if (loginStatus === -1) {
// We haven't finished checking for the user logged in or not
return <View style={styles.container} />;
}
ref && ref.current && ref.current.animateNextTransition();
return (
<NavigationContainer>
<Transitioning.View ref={ref} transition={TRANSITION} style={styles.transitionContainer}>
{loginStatus === 1 && <MainNavigator />} // STACK NAVIGATOR WHEN SIGNED IN
{loginStatus === 0 && <AuthNavigator />} // STACK NAVIGATOR WHEN SIGNED OUT
</Transitioning.View>
</NavigationContainer>
);
}
export default LoadingScreen;
signoutFunction() inside screen
const signOutAsync = async () => {
console.log("Begin Logout");
dispatch(updateUser(null));
await AsyncStorage.clear();
};