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

Logo de Flutter con el logo de Google

¿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:

  1. Usa GoogleSignIn.instance.
  2. Llama a .initialize() en tu main().
  3. Separa authenticate() de authorizeScopes().
  4. Escucha authenticationEvents para saber el estado del usuario.
  5. Usa try-catch para las nuevas excepciones.

¡Feliz codificación! 💻💙

Comentarios

Youtube