Este Tutorial lo diseñé específicamente porque clase 14 ha quedado muy desactualizada respecto a 2021. Pude recrear el código generado por Anahí pero tuve que consumir mucho tiempo buscando entre la documentación cómo se actualizaron los métodos y demás.
En primer lugar es importante aclarar algo que no se nombra ni en el curso de Flutter básico ni hasta ahora en el avanzado, no lo se respecto al curso de Dart ya que actualmente no está disponible en Platzi para verlo. Flutter tiene distintos channels según estemos trabajando con versiones beta o estables. Este tutoría lo hago con el canal estable, el cual usa determinadas dependencias. Si se desea utilizar la última versión de Flutter y Dart, se debe seleccionar el channel dev. Para seleccionar el channel estable ejecutamos en la terminal el siguiente comando:
flutter channel stable
el cual nos habilita a utilizar las siguientes dependencias:
firebase_database: ^6.0.0cloud_firestore: ^0.16.0+1
firebase_core: ^0.7.0firebase_auth: ^0.20.1google_sign_in: ^4.5.1firebase_storage: ^7.0.0
En caso de usar el channel dev, tenemos las librerías aún más actualizadas, en ese caso será necesario revisar en la documentación como quedan las equivalencias entre los distintos métodos y clases.
Ahora sí, dicho esto, arranco con el tutorial:
Trabajaremos con la librería de FirebaseAuth, esto lo haremos en el directorio repository
. Para ello creamos un archivo FirebaseAuthAPI. El sistema de archivos que crearemos irá de FirebaseAuth hacia BLoC y de allí hasta User.
Allí importaremos las siguientes librerías:
import'package:firebase_auth/firebase_auth.dart';
import'package:google_sign_in/google_sign_in.dart';
Este archivo se encargará de toda la lógica y los datos de la app con respecto de FirebaseAuth. Crearemos una variable global FirebaseAuth _auth
la cual contendrá la instancia de FirebaseAuth, es decir, la composición de lo que existe en la consola de Firebase.
Lo mismo haremos con GoogleSingIn
.
Luego creamos un método asincrónico, el cual buscará las credenciales en la base de datos de Google para ejecutar luego el inicio de sesión. Para ello creamos una instancia de la clase Future
cuya sintaxis es:
Future<T>
Donde <T>
es el tipo de dato que retorna, así por ejemplo, si retorna un String debemos colocar Future<String>
, si no retorna ningún dato, debemos colocar Future<void>
, etc.
El objetivo de trabajar de forma asíncrona es poder traer datos desde la base y de esa forma continuar con el proceso de ejecución de forma paralela.
Una vez creada la instancia future
es necesario al crear el método que vamos a usar indicar que es asíncrona a través de la palabra async
antes del cuerpo de la función de la siguiente forma:
**Future<String> createOrderMessage() async {
...
}**
En nuestro caso para crear la función debemos definir el tipo de dato como UserCredential
. Dentro de la función creamos dos variables donde por un lado llamaremos al método de singIn()
de Google el cual traerá el formulario para completar los datos y por otro creamos la variable gSA la cual tendrá un IdToken y un accessToken. Estos dos métodos llevan la palabra clave await
que permite pararelezizar las tareas mientras se traen los datos desde la base.
GoogleSignInAccount googleSignInAccount = await googleSignIn.signIn();
GoogleSignInAuthentication gSA = await googleSignInAccount.authentication;
Luego creamos las credenciales del usuario que almacenamos en la variable user:
UserCredential user = await _auth.signInWithCredential(GoogleAuthProvider.credential(idToken: gSA.idToken, accessToken: gSA.accessToken));
Entonces el código final queda:
import'package:firebase_auth/firebase_auth.dart';
import'package:google_sign_in/google_sign_in.dart';
classFirebaseAuthAPI{
final FirebaseAuth _auth = FirebaseAuth.instance;
final GoogleSignIn googleSignIn = GoogleSignIn();
Future<UserCredential> singIn() async{
GoogleSignInAccount googleSignInAccount = await googleSignIn.signIn();
GoogleSignInAuthentication gSA = await googleSignInAccount.authentication;
UserCredential user = await _auth.signInWithCredential(GoogleAuthProvider.credential(idToken: gSA.idToken, accessToken: gSA.accessToken));
return user;
}
}
Una vez creada la lógica de la autenticación creamos una clase repository
la cual nos permitirá controlar el flujo de datos. Esto lo haremos en el archivo auth_repository.dart
.
De esta forma creamos la clase AuthRepository
y dentro invocamos la lógica creada para realizar el login en firebase_auth_api.dart
. El código queda:
import'package:firebase_auth/firebase_auth.dart';
import'package:curso_avanzado_flutter_platzi/User/repository/firebase_auth_api.dart';
classAuthRepository{
final _firebaseAuthAPI = FirebaseAuthAPI();
Future<UserCredential> signInFirebase() => _firebaseAuthAPI.singIn();
}
sos un capo!
¡Buen aporte!
Muchas gracias!!
Muy GOD