首页 > 解决方案 > 如何在带有 React Navigation 的 createBottomTabNavigator 中使用 AsyncStorage?

问题描述

我使用 react-navigation v3,我想在 createBottomTabNavigator 中使用 AsyncStorage 来检查用户是否登录。

我将密钥保存在 LoginScreen 中:

await AsyncStorage.setItem('@MyStorage:isLogged', isLogged);

我想在我的堆栈(TabStack)中使用 AsyncStorage:

const TabStack = createBottomTabNavigator(
  {
    Home: { screen: HomeScreen, },
    // I need isLogged key from AsyncStorage here!
    ...(false ? {
      Account: { screen: AccountScreen, }
    } : {
      Login: { screen: LoginScreen, }
    }),
  },
  {
    initialRouteName: 'Home',
  }
);

我该怎么做?

我的环境:

标签: react-nativereact-navigationasyncstorage

解决方案


解决方法是:新建一个组件 AppTabBar 并在 tabBarComponent 属性中设置

const TabStack = createBottomTabNavigator({
    Home: { screen: HomeScreen, },
    Account: { screen: AccountScreen, }
},
{
  initialRouteName: 'Home',
  tabBarComponent: AppTabBar, // Here
});

和 AppTabBar 组件:

export default class AppTabBar extends Component {
  constructor(props) {
    super(props);

    this.state = {
      isLogged: '0',
    };
  }

  componentDidMount() {
    this._retrieveData();
  }

  _retrieveData = async () => {
    try {
      const value = await AsyncStorage.getItem('isLogged');
      if (value !== null) {
        this.setState({
          isLogged: value,
        });
      }
    } catch (error) {
      // Error retrieving data
    }
  };

  render() {
    const { navigation, appState } = this.props;
    const routes = navigation.state.routes;
    const { isLogged } = this.state;

    return (
      <View style={styles.container}>
        {routes.map((route, index) => {
          if (isLogged === '1' && route.routeName === 'Login') {
            return null;
          }

          if (isLogged === '0' && route.routeName === 'Account') {
            return null;
          }

          return (
            <View /> // here your tabbar component
          );
        })}
      </View>
    );
  }

  navigationHandler = name => {
    const { navigation } = this.props;
    navigation.navigate(name);
  };
}

推荐阅读