Sou novo no Flutter e atualmente estou criando um aplicativo usando Supabase para autenticação.
Tudo funciona bem, como registro de usuário, login, etc., mas estou enfrentando um problema ao sair.
Quando pressiono o botão de logout, o usuário é desconectado com sucesso, mas o aplicativo não navega para a página de login como esperado.
Este é o código de logout
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,
),
),
);
}
}
Este é o código de autenticação do portão
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(),
},
);
}
O que eu tentei:
Encapsulamento
signOut()
em um bloco try-catch — nenhum erro detectado.Verificado que
auth.signOut()
realmente desconecta o usuário.Os logs foram verificados e o AuthGate imprime a sessão como nula (esperado após o logout).
Mas ainda não redirecionado para LoginPage.
O que eu espero:
Após sair, o aplicativo deve redirecionar automaticamente para LoginPage (conforme tratado no AuthGate).
OBSERVAÇÃO Sempre que executo um aplicativo sem depuração, ele funciona.
Você tinha que navegar para
Setting
sair, então mesmo quando aAuthGate
página renderizada estivesse sendo atualizada, você ainda teria a página de configuração e talvez outras páginas na sua pilha.Uma boa solução seria sair e remover todas as páginas até a primeira.