Экспо реагировать на исходную функцию выхода из системы не работает должным образом - PullRequest
1 голос
/ 04 октября 2019

Я занимаюсь разработкой собственного приложения expo response. Там у меня проблема с выходом из системы. Выход из системы находится в разделе профиля пользователя. В соответствии с текущим кодом, когда я вхожу в приложение в первый раз, оно перенаправляет на основную навигацию (меню по умолчанию). Если я вхожу в приложение после выхода из системы, оно перенаправляется в раздел профиля.

  • Я пытался перейти в раздел входа в систему при выходе из системы. Это не сработало.
  • Я пытался перезагрузить приложение каждый раз, когда выходил из системы. Это работает для IOS не для Android. Но я чувствую, что это не очень хорошая практика.
//Using navigation
logOutPress() {
        var _this =this;
        firebase.auth().signOut().then(function () {
            // Sign-out successful.
            _this.props.navigation.navigate('Login');
            AsyncStorage.clear();
        }
    }

//Reloading
logOutPress() {
        var _this =this;
        firebase.auth().signOut().then(function () {
            // Sign-out successful.

            AsyncStorage.clear();
            Platform.OS == 'ios' ? NativeModules.DevSettings.reload() : '';
        }
    }

 //Create the required screens in StackNavigator
        var theScreen = createStackNavigator({
          Master: { screen: ({ navigation })=>(<MyMastSreen data={item} navigation={navigation} design={design} isRoot={true} />) },
          Categories: { screen: ({ navigation })=>(<MyCategoriesSreen data={item} navigation={navigation} design={design} isRoot={item.category_first} subMenus={[]} />) },
          MasterSUB: { screen: ({ navigation })=>(<MyCategoriesSreen data={{'categorySetup':item}} navigation={navigation} design={design} isRoot={true} subMenus={item.subMenus} />) },
          Details: { screen:({ navigation })=>(<MyDetailsSreen data={item} navigation={navigation} design={design} isRoot={true}/>) },
          DineIn: { screen:({ navigation})=>(<MyDineInScreen data={item} navigation={navigation} design={design} isRoot={true} />) },
          Gallery: { screen:({ navigation })=>(<MyGallerySreen data={item} navigation={navigation} design={design} />) },
          ForgetPassword: {screen: ForgetPassword},
          SignUp: { screen: SignUp }, 
          WebSub: { screen: ({ navigation })=>(<MyWebSreen data={item} navigation={navigation} design={design} isRoot={true} fromNotification={true} />) },
          NotificationsSub: { screen: ({ navigation })=>(<MyNotificationsSreen data={item} navigation={navigation} design={design} isRoot={false} />) },
          OrdersSub: { screen: ({ navigation })=>(<MyOrdersSreen data={item} navigation={navigation} design={design} isRoot={false} />) },
          TicketsSub: { screen: ({ navigation }) => (<MyTicketSreen data={item} userEmail={this.state.userEmail} navigation={navigation} design={design} isRoot={false} />) },
          OrderDetail: { screen: ({ navigation })=>(<MyOrderDetailSreen data={item} navigation={navigation} design={design}/>) },
          DineInOrders: { screen: ({ navigation })=>(<MyDineInOrderScreen data={item} navigation={navigation} design={design} isRoot={true} />) },
          // DineInOrderDetail: { screen: ({ navigation })=>(<MyDineInOrderDetailScreen data={item} navigation={navigation} design={design}/>) },
          ProfileSettingsSub: { screen:({ navigation })=>(<MyProfileSettingsSreen data={item} navigation={navigation} design={design} isRoot={false} />) },
          SubProfile: { screen: ({ navigation })=>(<MyProfileSreen data={item} navigation={navigation} design={design} isRoot={false} />)},
          ProfileSettings: { screen:({ navigation })=>(<MyProfileSettingsSreen data={item} navigation={navigation} design={design} />) },
          ListOfUsersSub: { screen:({ navigation })=>(<MyListOfUsersSreen data={item} navigation={navigation} design={design} />) },
          Chats: { screen:({ navigation })=>(<MyChatsSreen data={item} navigation={navigation} design={design} />) },
          Chat: { screen: ({ navigation })=>(<MyChatSreen data={item} navigation={navigation} design={design} />)},
          Gift: { screen: ({ navigation }) => (<MyGiftSreen data={item} userEmail={this.state.userEmail} navigation={navigation} design={design} />) },


        },{
          //initialRouteName:item.category_first?"Categories":(item.subMenus&&(item.subMenus.length>0?"MasterSUB":"Details")),
          initialRouteName:initialRootName,
          headerMode:"none",
          navigationOptions: {
            headerTintColor: 'blue',
          }
        });
      }

Мне хотелось бы открыть навигацию по умолчанию вместо раздела профиля, когда я вхожу в приложение послевыйти. Пожалуйста, помогите решить эту проблему.

Заранее спасибо.

1 Ответ

0 голосов
/ 07 октября 2019

Попробуйте это:

Я не вижу ссылки на вашу страницу Login в стеке, поэтому измените _this.props.navigation.navigate('Login'); на _this.props.navigation.navigate('SignUp');


Лучший способ обработки аутентификации и составления стека вашей навигации

  1. Используйте createSwitchNavigator для обработки корневых стеков, для вашего приложения это будет примерно так:
const AppNavigator = createSwitchNavigator(
   {
      Loading: LoadingScreen,   // Include a loading screen that will check authentication state
      Auth: AuthNavigator,
      Main: MainNavigator
   },
   {
      initialRouteName: 'Loading',
      // Other configs
   }
)
AuthStack это будет иметь все ваши логин. экраны регистрации, приветствия и т. д., как-то так:
const AuthStack = createStackNavigator(
   {
        SignUp: { screen: SignUp },
        ForgetPassword: {screen: ForgetPassword},
        // Include other screens here if applicable
   },
   {
        initialRouteName: 'SignUp'
        // Other configs
   }
)
В MainStack будут все экраны вашего приложения, из того, что вы показали в своем вопросе, это будет выглядеть примерно так:
const MainStack = createStackNavigator(
    {
          Master: { screen: ({ navigation })=>(<MyMastSreen data={item} navigation={navigation} design={design} isRoot={true} />) },
          Categories: { screen: ({ navigation })=>(<MyCategoriesSreen data={item} navigation={navigation} design={design} isRoot={item.category_first} subMenus={[]} />) },
          MasterSUB: { screen: ({ navigation })=>(<MyCategoriesSreen data={{'categorySetup':item}} navigation={navigation} design={design} isRoot={true} subMenus={item.subMenus} />) },
          Details: { screen:({ navigation })=>(<MyDetailsSreen data={item} navigation={navigation} design={design} isRoot={true}/>) },
          DineIn: { screen:({ navigation})=>(<MyDineInScreen data={item} navigation={navigation} design={design} isRoot={true} />) },
          Gallery: { screen:({ navigation })=>(<MyGallerySreen data={item} navigation={navigation} design={design} />) },
          WebSub: { screen: ({ navigation })=>(<MyWebSreen data={item} navigation={navigation} design={design} isRoot={true} fromNotification={true} />) },
          NotificationsSub: { screen: ({ navigation })=>(<MyNotificationsSreen data={item} navigation={navigation} design={design} isRoot={false} />) },
          OrdersSub: { screen: ({ navigation })=>(<MyOrdersSreen data={item} navigation={navigation} design={design} isRoot={false} />) },
          TicketsSub: { screen: ({ navigation }) => (<MyTicketSreen data={item} userEmail={this.state.userEmail} navigation={navigation} design={design} isRoot={false} />) },
          OrderDetail: { screen: ({ navigation })=>(<MyOrderDetailSreen data={item} navigation={navigation} design={design}/>) },
          DineInOrders: { screen: ({ navigation })=>(<MyDineInOrderScreen data={item} navigation={navigation} design={design} isRoot={true} />) },
          // DineInOrderDetail: { screen: ({ navigation })=>(<MyDineInOrderDetailScreen data={item} navigation={navigation} design={design}/>) },
          ProfileSettingsSub: { screen:({ navigation })=>(<MyProfileSettingsSreen data={item} navigation={navigation} design={design} isRoot={false} />) },
          SubProfile: { screen: ({ navigation })=>(<MyProfileSreen data={item} navigation={navigation} design={design} isRoot={false} />)},
          ProfileSettings: { screen:({ navigation })=>(<MyProfileSettingsSreen data={item} navigation={navigation} design={design} />) },
          ListOfUsersSub: { screen:({ navigation })=>(<MyListOfUsersSreen data={item} navigation={navigation} design={design} />) },
          Chats: { screen:({ navigation })=>(<MyChatsSreen data={item} navigation={navigation} design={design} />) },
          Chat: { screen: ({ navigation })=>(<MyChatSreen data={item} navigation={navigation} design={design} />)},
          Gift: { screen: ({ navigation }) => (<MyGiftSreen data={item} userEmail={this.state.userEmail} navigation={navigation} design={design} />) },
   },
   {
          initialRouteName: 'Master',   // <== Make sure to set this to the first screen you want on your application
          // Other configs
   }
)
LoadingScreen это должно выглядеть примерно так:
class LoadingScreen extends React.Component {
    componentDidMount = async () => {
        const userId = await AsyncStorage.getItem('userId')
        this.props.navigation.navigate(userId ? 'Main' : 'Auth')   // This will check if there is any item stored with userId, if true it will navigate to Main else to Auth
    }

    render() {
        return (
            <View
                style={{
                    flex: 1,
                    alignItems: 'center',
                    justifyContent: 'center',
                    backgroundColor: 'white'
                }}>
                <Text style={styles.textloadingStlye}>Loading Screen</Title>
            </View>
        )
    }
}
Поток аутентификации с AsyncStorage, когда вы впервые входите в систему или регистрируетесь, пользователь должен добавить это после успешной аутентификации и перед переходом к главному экрану, что-то вроде этого:
.... // Firebase login, then
await AsyncStorage.setItem('userId', id);   // <== Here id is what you want to store of the user data for authentication, could be his db id or name or whatever you have
this.props.navigation.navigate('Loading'); 
Ваш Signout, теперь, наконец, для выхода выполните:
logOutPress() {
   firebase.auth().signOut();   // <== This will signout from firebase
   AsyncStorage.clear();   // <== This will clear the userId from storage
   this.props.navigation.navigate('Loading');   // <== We navigate to the loading screen we set earlier, which will check if there is a userId and navigate accordingly 
}

Примечание: помните, что ваш основной стек теперь в этой настройке равен AppNavigator, поэтому убедитесь, чтоприведение export default createAppContainer(AppNavigator)

Надеюсь, это поможет!

...