Как выйти из системы со стэком вкладок в Аутентификацию? - PullRequest
0 голосов
/ 04 февраля 2020

Мой поток приложений, как показано ниже: -

App.js
│
└── AppSwitchNavigator
            └── MainSplash: { screen: SplashScreen }
            └── Auth: { screen: AuthStack } // createStackNavigator
            │       └── SignIn: { screen: MainSignIn }
            │       └── Register: { screen: MainRegister }
            │
            └── Dashboard: { screen: TabHelper } // createBottomTabNavigator
                    └── Home: { screen: HomeStack }
                    └── Favourite: { screen: FavouriteScreen }
                    └── Cart: { screen: CartStack }
                    └── Profile: { screen: ProfileStack }
                            └── MainProfile: { screen: ProfileScreen }
                            └── ChangePassword: { screen: PasswordScreen }
                            └── TrackOrder: { screen: TrackStack }

Вкл. ProfileScreen Я поместил заголовок с кнопкой выхода из системы, как показано ниже. enter image description here

<Header >
  <Left style={{ flex: null }}>
  </Left>
  <Body style={{ flex: 3 }}>
    <Title style={{ marginLeft: 10, }}>User Profile</Title>
  </Body>
  <Right style={{ flex: null }}>
    <Button hasText transparent onPress={() => Alert.alert(
      'Log out',
      'Do you want to logout?',
      [
        { text: 'Cancel', onPress: () => { return null } },
        { text: 'Confirm', onPress: () => { this.Func_LogoutUser() } },
      ],
      { cancelable: false }
    )}>
      <Text>Logout</Text>
    </Button>
  </Right>
</Header>

Я не могу выйти из системы на Auth. У меня есть попытка: -

this.props.navigation.navigate('Auth'); => Ничего не происходит

Я также пробую этот подход из здесь

const subAction = NavigationActions.navigate({ routeName: 'SignIn' });
AsyncStorage.clear().then(() => {
  this.props.navigation.navigate('Auth', {}, subAction);

});

ДОБАВЛЕНИЕ ДОПОЛНИТЕЛЬНЫЙ СКРИПТ

Текущий скрипт TabHelper: -

const tabScreen = createBottomTabNavigator(
    {
        'Home': {screen: HomeStack},
        'Favourite': {screen: FavouriteScreen},
        'Cart': {screen: CartStack},
        'Profile': {screen: profileStack}
    },
    {
        initialRouteName: 'Home',
        headerMode: 'none',
        backBehavior: 'initialRoute',
        defaultNavigationOptions: ({ navigation }) => ({
            tabBarOnPress: ({ navigation, defaultHandler }) => {
                navigation.popToTop();
                defaultHandler();
            },
        }),
    }
);
const AppContainer = createAppContainer(tabScreen);
var screen = '';
let isExit = true;
let lastBackPressed = null;
export default class tabHelper extends Component {
    constructor(props) {
        super(props);
    }
    componentDidMount() {
        BackHandler.addEventListener('hardwareBackPress', this.onBackAndroid);
    }

    componentWillUnmount() {
        BackHandler.removeEventListener('hardwareBackPress', this.onBackAndroid);
        lastBackPressed = null;
    }

    onBackAndroid() {
        if (isExit) {
            if (lastBackPressed && lastBackPressed + 2000 >= Date.now()) {
                BackHandler.exitApp();
                return true;
            }
            lastBackPressed = Date.now();
            ToastAndroid.show('Press again to exit the app', ToastAndroid.SHORT);
            return true;
        }
        return false
    }
    getActiveRouteName(navigationState) {
        if (!navigationState) {
          return null;
        }
        const route = navigationState.routes[navigationState.index];
        if (route.routes) {
          return this.getActiveRouteName(route);
        }
        return route.routeName;
      } 
    render() {
        return <AppContainer onNavigationStateChange={(prevNav, nav, action) => {
            screen = this.getActiveRouteName(nav)
            var routes = nav.routes;
            var currentRoutes = routes[routes.length - 1];
            if (screen === 'MainHome') {
                if (currentRoutes.routes[currentRoutes.index].index == undefined || currentRoutes.routes[currentRoutes.index].index == 0) {
                    isExit = true;
                } else {
                    isExit = false;
                }
            } else {
                isExit = false;
            }
        }} ref={navigatorRef => {
            NavigationService.setTopLevelNavigator(navigatorRef);
        }} />
    }
}

НАЙДЕНО: - В файле TabHelper, если я удаляю const AppContainer = createAppContainer(tabScreen); и далее (используйте для обработки нажмите кнопку на HomeScreen в фокусе) и замените на export default createAppContainer(tabScreen);, я могу выйти из системы и перейти к входу в систему. Как будто мне нужно выбрать один.

Как использовать обе функции? Обработка кнопки для «Нажмите еще раз для выхода» и выхода из системы навигации на вкладке помощник?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Я думаю, вы забыли импортировать навигацию.

импорт {withNavigation} из «response-navigation»

экспорт по умолчанию с помощью Navigation (ComponentName);

Также я рекомендую не использовать asyncstorage и использовать вместо этого expo Secure Store ,

Обновление

onPress={()=>this.props.navigation.navigate(“auth”)}
0 голосов
/ 04 февраля 2020

попробуйте это, вам нужно go выводить на экран, а не складывать, или если у вас есть defaultRoute в вашем стеке, тогда он должен перейти туда:

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

Надеюсь, это поможет .fee lfree для сомнений

...