Supabase Auth:onAuthStateChange未触发,Google登录异常
问题解决:Supabase Google Auth登录后状态不更新、currentUser为null的问题
以下是针对你遇到的问题的排查和解决方案:
1. 检查回调URL配置是否正确
Supabase控制台显示登录成功,但本地会话未同步,最常见的原因是回调URL不匹配。
- 进入Supabase控制台 → 认证 → URL配置
- 添加对应平台的回调URL:
- Android:
com.your.app.package://login-callback(替换为你的APP包名) - iOS:
your.app.bundle.id://login-callback(替换为你的APP Bundle ID) - Web:
http://localhost:5000/callback(根据本地开发端口调整)
- Android:
2. 修正Supabase初始化代码
确保在main函数中正确初始化Supabase客户端,指定回调URL的hostname:
void main() async { WidgetsFlutterBinding.ensureInitialized(); await Supabase.initialize( url: '你的Supabase项目URL', anonKey: '你的Supabase匿名密钥', authCallbackUrlHostname: 'login-callback', // 和回调URL的hostname一致 debug: true, // 开启调试日志,便于排查问题 ); runApp(const MyApp()); }
3. 完善登录按钮的异步处理
登录时需await signInWithOAuth,并指定对应平台的redirectTo,确保会话能正确返回APP:
ElevatedButton( onPressed: () async { final result = await supabase.auth.signInWithOAuth( Provider.google, redirectTo: Platform.isAndroid ? 'com.your.app.package://login-callback' : Platform.isIOS ? 'your.app.bundle.id://login-callback' : null, ); // 打印错误信息,排查登录异常 if (result.error != null) { print('登录失败:${result.error!.message}'); } }, child: const Text('Sign in'), )
4. 正确订阅Auth状态变化
确保onAuthStateChange的订阅被正确保存,并在页面销毁时取消,避免内存泄漏:
late StreamSubscription<AuthState> _authStateSubscription; @override void initState() { super.initState(); // 订阅Auth状态变化 _authStateSubscription = supabase.auth.onAuthStateChange.listen((authState) { final event = authState.event; final session = authState.session; print('Auth状态变更:$event'); if (event == AuthChangeEvent.signedIn) { print('logged'); // 此时session?.user即为当前登录用户 print('当前用户:${session?.user?.email}'); } }); } @override void dispose() { // 取消订阅 _authStateSubscription.cancel(); super.dispose(); }
5. 检查会话持久化设置
默认情况下Supabase会自动持久化会话,但如果初始化时手动设置了persistSession: false,会导致登录后会话不被保存,需确保该参数未被设置为false。
额外排查步骤
- 开启Supabase的
debug: true后,查看控制台日志,是否有回调失败、会话存储失败的相关信息 - 点击「Show user」时,可尝试先调用
await supabase.auth.refreshSession()再获取currentUser,强制刷新会话:
ElevatedButton( onPressed: () async { await supabase.auth.refreshSession(); print('当前用户:${supabase.auth.currentUser}'); }, child: const Text('Show user'), )
内容的提问来源于stack exchange,提问作者faccio
相关产品推荐
相关产品推荐

