在useEffect中调用onAuthStateChange无法更新状态(Supabase+Expo)
问题排查与修复方案
核心问题1:onAuthStateChange回调参数使用错误
Supabase的onAuthStateChange回调函数参数并非包含data.session的对象,正确签名是第一个参数为认证事件类型,第二个参数才是session对象。你当前的解构方式无法正确获取更新后的session,导致状态不更新。
核心问题2:未清理订阅导致潜在异常
在useEffect中订阅onAuthStateChange后,若不清理订阅,组件卸载时会产生内存泄漏,也可能干扰后续事件触发。
修复后的代码
useEffect(() => { // 初始化获取当前session supabase.auth.getSession().then(({ data: { session } }) => { setSession(session); }); // 订阅认证状态变化,使用正确的回调参数写法 const authSubscription = supabase.auth.onAuthStateChange((_event, session) => { setSession(session); }); // 组件卸载时清理订阅 return () => { authSubscription.unsubscribe(); }; }, []);
额外检查项
- 确认使用的Supabase JS SDK为最新稳定版,旧版本在Expo环境下可能存在事件触发异常。
- 测试登录/登出操作时,必须通过Supabase官方的
signInWithPassword、signOut等方法执行,非官方的session修改不会触发onAuthStateChange事件。
内容的提问来源于stack exchange,提问作者windosiller
相关产品推荐
相关产品推荐

