当退出我的应用程序signin screen is getting rendered twice.只有当我导航到另一个屏幕,然后返回initialroute时,才会发生这种情况.如果我没有在登录和注销后立即离开initialroute,它只会呈现一次.但一旦我开始在应用程序中导航,然后注销,登录屏幕就会呈现两次.

我正在使用reduxasyncstorage来处理我的应用程序中的身份验证流.我只发现一个人有相同的问题,他通过使用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();
};

推荐答案

这两个导航器似乎都已安装并受到登录的影响,因此我最终通过将这两个导航器包装在一个父堆栈容器中解决了这个问题,如下所示.

Loading screen.js

  const RootStack = createStackNavigator();
  const RootStackScreen = () => (
    <RootStack.Navigator screenOptions={{headerShown: false}}>
      {loginStatus ? (
        <RootStack.Screen name="Main" component={MainNavigator} />
      ) : (
        <RootStack.Screen name="Auth" component={AuthNavigator} />
      )}
    </RootStack.Navigator>
  );

  return (
    <NavigationContainer>
      <Transitioning.View ref={ref} transition={TRANSITION} style={styles.transitionContainer}>
        <RootStackScreen />
        {/*loginStatus === 1 && <MainNavigator />*/}
        {/*loginStatus === 0 && <AuthNavigator />*/}
      </Transitioning.View>
    </NavigationContainer>
  );

学分:100

Reactjs相关问答推荐

导致类型错误的调度不是函数";

条件索引路由

可选链和useState挂钩

如何在关闭和打开此 Select 输入时应用旋转效果?

如何在我的 React 应用程序中仅显示我的 Register 组件

修改React数据表扩展组件

REACT: UseState 没有更新变量(ant design 模态形式)

解决在React测试库中的act()警告

ReactJS on AWS Amplify与EC2上的Spring boot服务之间的混合内容错误

使用 map 循环浏览列表列表中的列表并显示它们

损坏的图像 React useState

如何在react 中正确销毁上下文?

null 不是对象(判断RNSound.IsAndroid)

将 ref 转发到所有页面(路由组件)只是为了将其应用于
并具有跳过导航链接(按钮).有没有更好的办法?

将 ref 赋予功能组件以使用内部功能

设置 Material UI 表格默认排序

网格项不缩小以适应包含的可滚动列表

React - useParams() 不会失败 null / undefined 判断

将 C# Razor 条件块转换为 React.js 代码

由于另一个子组件,如何在react 中渲染另一个子组件