0

我正在使用本机反应和反应导航。我正在创建一个反应导航抽屉,然后使用我自己的格式在抽屉内。我正在努力让我的注销按钮正常工作。

这工作正常:

 <TouchableOpacity onPress={this.props.logoutUser()}>
     <Text style={{margin: 16,fontWeight: 'bold'}}>Logout</Text>
 </TouchableOpacity>

但我想包含一个警报并确保用户想要退出。这行不通。它注销用户/下次我登录应用程序时,我可以看到他们已注销,但它不会触发我的应用程序的刷新,直到我手动刷新它。

    <TouchableOpacity onPress={()=>
          Alert.alert(
            'Log out',
            'Do you want to logout?',
            [
              {text: 'Cancel', onPress: () => {return null}},
              {text: 'Confirm', onPress: () => {
                this.props.logoutUser
              }},
            ],
            { cancelable: false }
          )  
        }>
        <Text style={{margin: 16,fontWeight: 'bold'}}>Logout</Text>
    </TouchableOpacity>

作为参考,这里是我如何根据用户是否登录来呈现登录屏幕与主页(props.restoreing)的变化。出于某种原因,它只更新顶部调用,我想知道抽屉或警报是否会影响我调用函数的方式:

const ChatAppComponent = props => {
  if (props.restoring) {
    return <ActivityIndicator style={styles.activityIndicator} />
  } else {
    if (props.logged) {
      return <DashboardNavigator />
    } else {
      return <AuthScreen />
    }
  }
}

编辑:添加注销功能

export const logoutUser = () => {
  return dispatch => {
    dispatch(sessionLoading());

    LoginManager.logOut();
    firebaseService
      .auth()
      .signOut()
      .then(async () => {
        await GoogleSignin.revokeAccess();
        await GoogleSignin.signOut();
        dispatch(sessionLogout());
      })
      .catch(error => {
        dispatch(sessionError(error.message));
      });
  };
};
4

2 回答 2

1

您需要使用 redux 调用此函数。

<TouchableOpacity onPress={()=>
   Alert.alert(
        'Log out',
        'Do you want to logout?',
        [
          {text: 'Cancel', onPress: () => {return null}},
          {text: 'Confirm', onPress: () => {
            this.props.dispatch(this.props.logoutUser()); //here
          }},
        ],
        { cancelable: false }
      )  
    }>
    <Text style={{margin: 16,fontWeight: 'bold'}}>Logout</Text>
</TouchableOpacity>

因为注销功能是一个 redux 动作。

于 2019-05-17T18:22:47.613 回答
0

答案与异步等待有关。不知道为什么它以前不能与 async await 一起使用,但我不得不将调度操作移到 Google 方法之上。

firebaseService
          .auth()
          .signOut()
          .then(async () => {
            dispatch(sessionLogout());
            await GoogleSignin.revokeAccess();
            await GoogleSignin.signOut();
          })
于 2019-05-18T00:30:33.700 回答