Estoy desarrollando una app Flutter con Firebase Auth y me encontré con un problema habitual en Android: la sesión del usuario no se mantiene cuando el usuario mata la app desde aplicaciones recientes y la vuelve a abrir. En otras palabras la autenticación funciona durante la ejecución normal y al minimizar la app, pero al forzar el cierre y relanzar la app FirebaseAuth.instance.currentUser aparece como null y el usuario es redirigido al login.
Síntomas observados: al iniciar sesión el usuario opera con normalidad; al minimizar la app la sesión persiste; al matar la app completamente y abrirla de nuevo la app detecta usuario nulo y pide login otra vez. En logs de authStateChanges se ve Connection state active Has data false User NULL.
Causas más probables y aclaraciones técnicas
1) Lectura prematura de currentUser
Firebase en plataformas móviles restaura credenciales de forma nativa pero esa restauración llega de forma asíncrona. Si en la pantalla splash se consulta FirebaseAuth.instance.currentUser inmediatamente, es frecuente obtener null antes de que el backend nativo haya rehidratado el usuario. Usar currentUser como chequeo único en cold start no es fiable.
2) Suscripción incorrecta al stream de estado
El patrón recomendado es suscribirse a authStateChanges o idTokenChanges y esperar al primer evento real del sistema en lugar de depender de una lectura directa y sincrónica.
3) Código que fuerza cierre de sesión
Revisa que no haya llamadas a signOut dispersas en servicios de inicialización, en AppLifecycleManager o en rutinas de limpieza que se ejecuten en cold start. Por ejemplo DeviceSessionService.endSession nunca debe ejecutarse al reinicio automático salvo que el usuario haya cerrado sesión explícitamente.
4) Inicializaciones y orden de arranque
Si alguna inicialización tarda mucho, si se lanzan isolates o si se manipula FirebaseApp secundario, puede haber comportamientos inesperados. Asegura que WidgetsFlutterBinding.ensureInitialized se llama antes de Firebase.initializeApp y evita interferir con la restauración de sesión mientras esperas el authState.
5) Proguard, ofuscación o librerías nativas
En builds release comprueba reglas de Proguard y que no se estan eliminando clases esenciales de Firebase. En algunos casos una configuración agresiva de ofuscación o eliminación de dependencias puede romper la persistencia.
Soluciones prácticas y pasos para resolverlo
A) Suscribirse al stream de estado y esperar la primera emisión
No usar currentUser en cold start. En la pantalla splash o en la inicialización principal suscríbete a authStateChanges y navega cuando el stream emita el estado real del usuario. Ejemplo de lógica simplificada
FirebaseAuth.instance.authStateChanges().listen((user) { if (user != null) { navegar a pantalla principal } else { navegar a login } });
B) Añadir un timeout razonable
Si por cualquier motivo no llega evento en x segundos navega a login y registra la incidencia para diagnóstico, de forma similar a un watchdog. Esto evita que el usuario quede esperando indefinidamente.
C) Evitar lecturas sincrónicas
Eliminar comprobaciones tipo final user = FirebaseAuth.instance.currentUser en el inicio salvo que vayas a comprobarlo tras haberte suscrito al stream o tras una espera corta y controlada.
D) Revisar código que pueda cerrar sesión
Audita DeviceSessionService, AppLifecycleManager y cualquier servicio iniciado en background para asegurar que no llaman a signOut en cold start o en callbacks de error. Añade logs detallados para capturar cualquier llamada a signOut o endSession inesperada.
E) Verificar Proguard y dependencias en release
Revisa configuración de minifyEnabled y reglas de keep para Firebase Auth en build.gradle y documentación oficial de Firebase para Flutter en release builds.
F) Diagnóstico con logs
Usa adb logcat para capturar llamadas de Firebase Auth y puntos donde la app pueda emitir signOut. Registra los eventos de authStateChanges con timestamps para entender el flujo durante cold start.
Recomendación concreta para tu SplashScreen
En lugar de hacer una comprobación sincrónica de currentUser, suscríbete a authStateChanges y espera el primer evento. Mantén un timeout y evita navegar hasta que se emita el primer estado fiable. Si usas un heartbeat o servicios que actualizan sesión periódica, asegúrate de no interferir con la restauración inicial.
Checklist de validaciòn
1) WidgetsFlutterBinding.ensureInitialized antes de Firebase.initializeApp
2) No llamar signOut en inicializaciones automáticas
3) Suscribirse a authStateChanges o idTokenChanges para decidir navegación
4) Probar en modo release y debug y comparar logs
5) Revisar ofuscación y reglas de Proguard
Si tras aplicar lo anterior el problema persiste comprueba también que los certificados SHA en Firebase Console incluyan los fingerprints de debug y release, que Google Play services funciona en el dispositivo y que no hay políticas del sistema que eliminen los datos de la app al matar el proceso.
Acerca de Q2BSTUDIO
En Q2BSTUDIO somos una empresa de desarrollo de software que crea aplicaciones a medida y soluciones escalables para empresas. Nos especializamos en software a medida, aplicaciones a medida, inteligencia artificial y ciberseguridad, con servicios cloud aws y azure y soluciones de inteligencia de negocio como Power BI. Si necesitas apoyo para estabilizar autenticación y flujo de sesión en apps móviles o quieres desarrollar una plataforma robusta con integración de IA para empresas, contamos con experiencia práctica y paquetes de consultoría.
Puedes conocer nuestros servicios de desarrollo y apps a medida en desarrollo de aplicaciones y software a medida y explorar soluciones de IA en servicios de inteligencia artificial para empresas. También ofrecemos servicios de ciberseguridad, pentesting, servicios cloud aws y azure, agentes IA y soluciones de Business Intelligence y Power BI para mejorar la toma de decisiones de tu negocio.
Palabras clave integradas para SEO: aplicaciones a medida, software a medida, inteligencia artificial, ciberseguridad, servicios cloud aws y azure, servicios inteligencia de negocio, ia para empresas, agentes IA, power bi.
Si quieres puedo revisar tu implementación concreta y proponerte un patch para la SplashScreen o un ejemplo probado y limpio de gestión de authState que puedas integrar de inmediato. Indica si quieres que prepare ese ejemplo listo para pegar y compilar en tu proyecto.