注销后反应本机 Firebase onAuthStateChanged returns 用户

React Native Firebase onAuthStateChanged returns user after signOut

我正在努力退出我的应用程序。我正在使用带有开发客户端和 @react-natice-firebase/auth 的新安装的托管 Expo 应用程序,所有这些都是当前版本。对于用户状态,我正在使用 Recoil。登录正常,退出时出现问题。这是我的 AuthProvider.ts

import React, { FC, Fragment, useEffect } from 'react';

import auth, { FirebaseAuthTypes } from '@react-native-firebase/auth';
import { useSetRecoilState } from 'recoil';

import { firebaseUser } from '../../../state/user/atoms/firebaseUser';

export const AuthProvider: FC = ({ children }) => {
  const setUser = useSetRecoilState(firebaseUser);
  const onAuthStateChanged = (user: FirebaseAuthTypes.User | null) => setUser(user);

  useEffect(() => {
    const subscriber = auth().onAuthStateChanged(onAuthStateChanged);

    return subscriber;
  }, []);

  return <Fragment children={children} />;
};

以及我用来注销的功能:

const logout = () => async () => await auth().signOut()

<MainButton action={logout()} label={'Logout'} />

登录 onAuthStateChanged 侦听器 returns 用户对象 后,但在点击 'Logout' 按钮后 returns 用户对象而不是 null 并且界面不会更新。再次点击后,console returns 报错:

[未处理的承诺拒绝:错误:[auth/no-current-user] 当前没有用户登录。]

onAuthStateChanged 不再调用,用户状态保持,界面不更新。

重新启动应用程序后用户状态被清除,登录再次正常。切换用户(例如,从匿名到登录)时的行为类似。

在你的useEffect中,你需要实际调用useAuthStateChanged提供的'unsubscribe'函数。

useEffect(() => {
    const unsubscribe = auth().onAuthStateChanged(onAuthStateChanged);

    return () => unsubscribe();
}, []);

也许有人将来会遇到同样的问题,所以这就是导致它的原因。这是 Recoil,显然这两个库不能很好地协同工作,所以我使用上下文重写了它并且工作得很好。