¿Tu Login con Google en Flutter Dejó de Funcionar? La Guía Definitiva para Migrar a google_sign_in v7

¿Tu Login con Google en Flutter Dejó de Funcionar? 🤯
La Guía Definitiva para Migrar a google_sign_in
v7
Si has actualizado recientemente el paquete google_sign_in
y de repente todo se ha roto con errores como undefined constructor
o accessToken isn't defined
, respira hondo. 🧘♂️ No estás solo, y la solución no es un pequeño parche, sino entender los cambios fundamentales que trae la versión 7.x.
Google ha modernizado sus SDKs nativos, y el paquete de Flutter ha tenido que adaptarse por completo. ¡Pero no te preocupes! Aquí te guiamos por los cambios clave, basados en la guía de migración oficial, para que vuelvas a tener tu login funcionando en minutos.
1. Singleton a la Vista: La Instancia Única 💎
Antes, creabas una nueva instancia con GoogleSignIn()
. ¡Eso ya es historia! Para evitar problemas y asegurar un único punto de control, ahora debes acceder a la instancia compartida (singleton).
Antes (v6) ❌
final GoogleSignIn _googleSignIn = GoogleSignIn();
Ahora (v7) ✅
final GoogleSignIn _googleSignIn = GoogleSignIn.instance;
2. El Paso Cero: ¡No te olvides de initialize()
! 🚀
Antes de usar cualquier método, ahora es obligatorio inicializar el plugin. Este paso es crucial, especialmente en la web. Debes llamarlo una sola vez, idealmente en tu función main()
.
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Inicializa Google Sign-In ANTES de runApp
await GoogleSignIn.instance.initialize();
runApp(const MyApp());
}
3. Autenticación vs. Autorización: Dos Pasos Separados 🔑
Este es el cambio conceptual más importante. Antes, signIn()
hacía todo de golpe. Ahora, los procesos se separan:
- Autenticación (👤): Verifica quién eres. Se usa
authenticate()
. - Autorización (📜): Pide permiso para acceder a tus datos (perfil, email...). Se usa
authorizeScopes()
.
Piensa en ello como entrar a un edificio: la autenticación es mostrar tu DNI en la entrada. La autorización es pedir la llave de una oficina para poder usar lo que hay dentro.
4. Adiós signInSilently
, Hola attemptLightweightAuthentication
👋
El inicio de sesión "silencioso" cambia de nombre para ser más preciso. Ya no se garantiza que sea invisible. Además, ¡atención! En la web no devuelve un Future
, así que no puedes usar await
. La solución es escuchar el stream authenticationEvents
.
5. El Fin de currentUser
: Ahora Tú Tienes el Control 🎮
El plugin ya no guarda el estado del "usuario actual". Ahora, tu aplicación es responsable de saber si alguien ha iniciado sesión. ¿Cómo? ¡Escuchando eventos!
// En tu State o ViewModel
GoogleSignIn.instance.authenticationEvents.listen((account) {
if (account != null) {
// El usuario ha iniciado sesión. ¡Actualiza tu UI!
} else {
// El usuario ha cerrado sesión.
}
});
6. Manejo de Errores Mejorado con GoogleSignInException
🚨
Se acabaron los `null` ambiguos. Ahora, cualquier fallo (incluyendo que el usuario cancele el login) lanzará una GoogleSignInException
. Esto hace que tu código sea mucho más limpio y robusto con bloques try-catch
.
Antes (v6) ❌
final user = await _googleSignIn.signIn();
if (user == null) {
// El usuario canceló
}
Ahora (v7) ✅
try {
final user = await GoogleSignIn.instance.authenticate();
} on GoogleSignInException catch (e) {
if (e.code == GoogleSignInExceptionCode.canceled) {
print('El usuario canceló el inicio de sesión.');
}
}
Conclusión y Resumen Rápido 🏁
Aunque requiere reescribir la lógica, el resultado es una implementación más estable y moderna. Aquí tienes tu chuleta:
- Usa
GoogleSignIn.instance
. - Llama a
.initialize()
en tumain()
. - Separa
authenticate()
deauthorizeScopes()
. - Escucha
authenticationEvents
para saber el estado del usuario. - Usa
try-catch
para las nuevas excepciones.
¡Feliz codificación! 💻💙
Comentarios
Publicar un comentario