updateProfile后onAuthStateChanged未触发,如何触发以更新用户信息?
解决Firebase updateProfile后onAuthStateChanged不触发的问题
你说得没错,onAuthStateChanged仅监听用户登录/登出、认证凭证有效性变更这类核心认证状态变化,用户资料(如displayName)的更新不属于这个触发范围,所以调用updateProfile()后不会触发该回调。
解决方案1:改用onIdTokenChanged监听
onIdTokenChanged的触发范围更广,除了认证状态变化外,当用户资料更新时(更新profile会刷新ID Token)也会触发回调。只需将App.js中的onAuthStateChanged替换为onIdTokenChanged即可:
import { auth, onIdTokenChanged } from '../../src/Firebase'; useEffect(() => { const unsubscribe = onIdTokenChanged(auth, (user) => { console.log('用户状态或资料变更') if (user) { setUser(user); } else { setUser(null); } setIsLoading(false) }); return unsubscribe; }, []);
解决方案2:手动同步更新后的用户状态
在updateProfile执行成功后,直接获取更新后的用户对象,通过状态管理(如Context、Redux)或组件通信(props回调)同步到App的user状态中:
修改SignUp.js的handleSignUp:
const handleSignUp = async() => { try{ setSending(true) await createUserWithEmailAndPassword(auth, email, password) await updateProfile(auth.currentUser, {displayName: userName}) // 获取更新后的用户信息 const updatedUser = auth.currentUser; // 根据你的状态管理方式同步,比如用Context: // const { setUser } = useAuthContext(); // setUser(updatedUser); }catch(err){ console.log(err) }finally{ setSending(false) } }
解决方案3:修复reload()的异步调用
你之前尝试的auth.currentUser.reload()无效,是因为它是异步方法,需要加上await等待完成,再同步状态:
const handleSignUp = async() => { try{ setSending(true) await createUserWithEmailAndPassword(auth, email, password) await updateProfile(auth.currentUser, {displayName: userName}) // 等待reload完成 await auth.currentUser.reload(); // 同步更新后的用户 const updatedUser = auth.currentUser; setUser(updatedUser); // 需确保能访问到App的setUser方法 }catch(err){ console.log(err) }finally{ setSending(false) } }
推荐方案
优先选择方案1,它不需要额外的手动同步逻辑,自动覆盖认证状态和用户资料的变更场景,更符合Firebase的设计逻辑。
内容的提问来源于stack exchange,提问作者Keldryn
相关产品推荐
相关产品推荐

