异步存储会话无法正常工作

时间:2019-08-12 17:28:16

标签: reactjs react-native

我已经使用asyncstorage进行登录和注销。但是它不起作用,当我打开应用程序时,它总是显示登录屏幕。请查看我的代码,

// LoginFirst.tsx

let userID = response.data.details[0].id.toString();
                let userName = response.data.details[0].username.toString();
                let email = response.data.details[0].email.toString();
                let accountType = response.data.details[0].account_type.toString();
                let eventID = response.data.details[0].event_id;
                eventID = (eventID === null) ? 0 : eventID.toString();

                SetUserStorage.setUserDetails('userLoginStatus', 1);
                SetUserStorage.setUserDetails('userId', userID);
                SetUserStorage.setUserDetails('userName', userName);
                SetUserStorage.setUserDetails('userEmail', email);
                SetUserStorage.setUserDetails('userAccountType', accountType);
                SetUserStorage.setUserDetails('userEventID', eventID);

                this.props.navigation.navigate('Home');

// GetUserStorage.tsx

import { AsyncStorage } from 'react-native';

export const getUserDetails = async (sessionValue) => {
let userSession = '';

try {
    userSession = await AsyncStorage.getItem(sessionValue) || 0;
} catch (error) {
    // Error retrieving data
    console.log(error.message);
}

return userSession;
}

// SetUserStorage.tsx

import { AsyncStorage } from 'react-native';

export const setUserDetails = async (sessionType, sessionValue) => {
try {
    await AsyncStorage.setItem(sessionType, sessionValue);
} catch (error) {
    // Error retrieving data
    console.log(error.message);
}
}

// ClearUserStorage.tsx

import { AsyncStorage } from 'react-native';

export const clearAllStorage = async () => {
try {
    await AsyncStorage.clear();

    return 1;
} catch (error) {
    // Error retrieving data
    console.log(error.message);

    return 0;
}
}

// Splash.tsx

export default class Splash extends Component {
async componentDidMount() {
let routeNames = 'LoginFirst';
const isLogin = await AsyncStorage.getItem('userLoginStatus');

setTimeout(() => {
  this.setState({ isLoading: false });

  const { navigate } = this.props.navigation;

  if (isLogin !== null || isLogin === 'true') {
    routeNames = 'Home';
  } else {
    routeNames = 'LoginFirst';
  }

  // navigate(routeNames);

  const resetAction = StackActions.reset({
    index: 0,
    actions: [NavigationActions.navigate({ routeName: routeNames })]
  });

  this.props.navigation.dispatch(resetAction);
}, 2000);
}

render() {
return (
  <View style={styles.container}>
    <Image
      style={styles.logo}
      source={require('../../../assets/logo.png')}
    />
  </View>
);
}
}

// Logout.tsx

logoutBtn = async () => {
    let clear = await clearStorage.clearAllStorage();

    if (clear) {
        this.props.navigation.navigate('LoginFirst');
    }
}

每次打开应用程序时,都会显示登录屏幕。我已经使用启动画面(Splash.tsx)来检查会话。

如何保留会话而不显示登录屏幕。我的代码中还有什么要做的吗?

1 个答案:

答案 0 :(得分:1)

登录时,您尝试将1存储在 userLoginStatus 中,但是,我们只能将字符串存储在AsyncStorage中。

因此,每次从AsyncStorage获取 userLoginStatus 时,它都会返回null,这就是为什么您始终登录登录屏幕的原因。