注销后反应本机 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,显然这两个库不能很好地协同工作,所以我使用上下文重写了它并且工作得很好。
我正在努力退出我的应用程序。我正在使用带有开发客户端和 @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,显然这两个库不能很好地协同工作,所以我使用上下文重写了它并且工作得很好。