我是 Flutter 的新手,目前正在构建一个使用 Supabase 进行身份验证的应用程序。
用户注册、登录等一切都运行正常,但我遇到了退出问题。
当我按下注销按钮时,用户确实成功注销,但应用程序没有按预期导航到登录页面。
这是注销代码
import 'package:expense_tracker/auth/auth_service.dart';
import 'package:expense_tracker/components/elevated_button.dart';
import 'package:flutter/material.dart';
class Setting extends StatefulWidget {
const Setting({super.key});
@override
State<Setting> createState() => _SettingState();
}
class _SettingState extends State<Setting> {
final auth = authService();
void logout() async {
await auth.signOut();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: CustomButton(
onPress: logout,
text: "Logout",
isSmall: true,
),
),
);
}
}
这是授权门代码
import 'package:expense_tracker/pages/home_page.dart';
import 'package:expense_tracker/pages/login_page.dart';
import 'package:flutter/material.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
class AuthGate extends StatelessWidget {
const AuthGate({super.key});
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: Supabase.instance.client.auth.onAuthStateChange,
builder: (context, snapshot) {
print("Auth state changed: ${snapshot.data}");
if (snapshot.connectionState == ConnectionState.waiting) {
return const Scaffold(
body: Center(child: CircularProgressIndicator()),
);
}
final session = Supabase.instance.client.auth.currentSession;
print("Current session: $session");
if (session != null) {
return HomePage();
} else {
return LoginPage();
}
},
);
}
}
This is main page code
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
themeMode: ThemeMode.system,
theme: MyThemes.lightTheme,
darkTheme: MyThemes.darkTheme,
home: const AuthStateListener(),
routes: {
"/login": (context) => const LoginPage(),
"/register": (context) => const RegisterPage(),
"/home": (context) => const HomePage(),
"/expense": (context) => const AddExpense(),
"/split": (context) => const SplitFriends(),
"/setting": (context) => const Setting(),
},
);
}
我尝试过的方法:
包装
signOut()
在 try-catch 块中 — 没有捕获到错误。已验证
auth.signOut()
用户确实已退出。检查日志,AuthGate 将会话打印为空(退出后预期)。
但仍然没有重定向到LoginPage。
我的期望:
退出后,应用程序应自动重定向到 LoginPage(如 AuthGate 中处理的那样)。
注意: 每当我运行应用程序而不进行调试时,它都可以运行。