Contenido del curso
Fundamentos de BLoC y Firebase
Navegación y Autenticación
- 10

BlocProvider y RepositoryProvider en Flutter
06:24 min - 11

Pantalla de login con BlocListener en Flutter
11:12 min - 12

Creación y Validación de Formularios en Flutter con Firebase
17:43 min - 13

Rutas en Flutter con GoRouter y Firebase Auth
15:46 min - 14

Conectar botón de login con Firebase Auth
11:34 min - 15

Cómo implementar logout con Firebase y GoRouter
Viendo ahora
Diseño Avanzado en iOS
Integración con Firestore usando BLoC
- 18

Modelo e repositório Firestore para BLoC
16:43 min - 19

Manejo de Estados y Eventos en Flutter con Bloc para Finanzas
09:57 min - 20

Agregar transacciones en Firebase con Flutter Bloc
06:41 min - 21

Eliminar Transacciones con Firebase en Flutter
05:29 min - 22

MultiBlocProvider con auth y transacciones en Flutter
06:06 min
Funcionalidades con BLoC
- 23

BlocBuilder para mostrar datos en Flutter
15:13 min - 24

Integración de Gráficas y Estados en Aplicaciones Flutter
11:50 min - 25

Creación de Listados Dinámicos en Aplicaciones Flutter
18:25 min - 26

Configuración de Balance y Estados en Pantalla de Wallet
07:12 min - 27

Lista de Transacciones en Aplicaciones Móviles
04:02 min - 28

Agregar Transacciones en Firebase con Flutter y Bloc
10:55 min - 29

Eliminar transacciones en Flutter con BLoC y Firebase
03:57 min
Testing
Cómo implementar logout con Firebase y GoRouter
Resumen
Cerrar sesión en una app Flutter con autenticación Firebase parece simple, pero requiere coordinar tres piezas: el evento del bloc, el cambio de estado y la redirección con GoRouter. Aquí verás cómo conectar esos elementos para que el flujo de logout funcione sin errores y devuelva al usuario a la pantalla de login.
Esta guía es útil si ya tienes una app Flutter con Firebase Authentication y quieres añadir un cierre de sesión confiable, con confirmación previa y manejo de excepciones.
¿Cómo crear un usuario en Firebase Authentication para probar el login?
Antes de programar el cierre de sesión, necesitas un usuario válido. Desde la consola de Firebase, en la sección Authentication, encontrarás los métodos de inicio activos y la pestaña Users para registrar credenciales manualmente.
- Selecciona el método correo y contraseña.
- Agrega un correo y una contraseña con al menos seis caracteres.
- Guarda el usuario y recarga para verificar que aparece en la lista.
Con esas credenciales puedes iniciar sesión desde la app y validar que los validators del campo de contraseña están funcionando. Si la contraseña es muy corta, el formulario te lo señalará antes de enviar la petición [02:30].
¿Cuál es la longitud mínima recomendada para una contraseña en Firebase? Firebase exige al menos seis caracteres. Si pones menos, el validator del campo bloquea el envío.
¿Qué pantallas componen el dashboard de la app?
Una vez autenticado, el usuario entra al dashboard, que es el componente central donde se muestra el balance general. Desde ahí se accede a otras vistas pensadas para gestión financiera personal.
- Gráfico con meses de ejemplo para visualizar tendencias.
- Listado de compras con descripción y precio.
- Pantalla de transacciones con su contraseña asociada.
- Configuración del perfil del usuario.
El problema: ninguna de estas pantallas incluye todavía un botón para cerrar sesión. Ese es el punto que vamos a resolver en profile [04:15].
¿Cómo agregar el botón de logout en la pantalla de perfil?
Dentro de profile ya existe un widget reutilizable que renderiza opciones con icono y título. Vamos a sumar una nueva option para el cierre de sesión usando el icono Icons.logout, que visualmente comunica la acción al usuario.
El título de la opción es simplemente logout, y necesita un callback onTap que sea asíncrono, porque la llamada al servicio de Firebase devuelve un Future. Antes de ejecutar el cierre, conviene mostrar un cuadro de confirmación reutilizando el widget de diálogo del proyecto.
dart onTap: () async { final confirmed = await showConfirmationDialog(context); if (confirmed == true) { context.read<AuthBloc>().add(AuthLogoutRequested()); context.go('/login'); } }
Un detalle fácil de pasar por alto: si el widget padre está marcado como const, la opción con función dinámica no puede serlo. Quita el const solo de la opción que recibe el callback, no de las demás.
¿Por qué onTap debe ser async en el logout? Porque la confirmación del diálogo y la operación de Firebase devuelven Future. Sin
async/await, no podrías esperar la respuesta antes de redirigir.
¿Cómo conectar el botón con el AuthBloc?
El AuthBloc funciona como centro de control del estado de autenticación. Desde el onTap se accede con context.read<AuthBloc>() y se dispara el evento AuthLogoutRequested, que internamente llama al repositorio para cerrar sesión en Firebase.
Después del evento, redirige con GoRouter usando context.go('/login'). Si la pantalla aún no tiene GoRouter importado, añade los imports de Flutter y go_router antes de compilar.
¿Por qué falla la redirección a login después del logout?
Al probar el flujo, la consola de debug mostraba una excepción de GoRouter indicando que no pudo crear la página de login. El path estaba bien escrito, así que el error venía de otro lado: del estado que devolvía el bloc tras cerrar sesión.
En el evento de logout, el state seguía marcando isAuthenticated: true, igual que en el inicio de sesión exitoso. Eso es incoherente: si cierras sesión, el estado debe pasar a false para que el router permita ir a login.
dart try { await authRepository.logout(); emit(state.copyWith(isAuthenticated: false)); } catch (e) { emit(state.copyWith( isAuthenticated: false, error: e.toString(), )); }
Envolver la operación en un try/catch te da dos beneficios: el happy path actualiza el estado correctamente, y si Firebase falla, capturas la excepción con exception.toString() para verla en consola y debuguear.
¿Qué hace context.read en un AuthBloc? Obtiene la instancia del bloc desde el árbol de widgets sin escuchar cambios. Es ideal para disparar eventos puntuales como un logout.
¿Cómo validar el flujo completo de autenticación?
Después de ajustar el estado y guardar, recarga la app, inicia sesión con tu usuario de Firebase y entra a profile. Al pulsar logout, el modal de confirmación aparece; al confirmar, confirmed se vuelve true, el bloc emite el nuevo estado y GoRouter redirige a /login sin excepciones.
Con esto tienes una app Flutter que autentica, mantiene sesión y la cierra correctamente. Te invito a crear varios usuarios desde Firebase y probar combinaciones: contraseñas inválidas, sesiones simultáneas y errores forzados. ¿Qué parte del flujo te dio más problemas al implementarlo?