Flutter Google Sign In - Email data returns null
2,363
@override
Future<User> signInWithGoogle() async {
GoogleSignIn _googleSignIn = GoogleSignIn();
GoogleSignInAccount _googleUser = await _googleSignIn.signIn();
String _googleUserEmail = _googleUser.email; //BURADA GMAİL OTURUMUNDAN
// DİREKT OLARAK MAİL ADRESİNİ ALMAYA ÇALIŞIYORUM.
if (_googleUser != null) {
GoogleSignInAuthentication _googleAuth = await _googleUser.authentication;
if (_googleAuth.idToken != null && _googleAuth.accessToken != null) {
AuthResult sonuc = await _firebaseAuth.signInWithCredential(
GoogleAuthProvider.getCredential(
idToken: _googleAuth.idToken,
accessToken: _googleAuth.accessToken));
FirebaseUser _user = sonuc.user;
sonuc.user.updateEmail(_googleUserEmail);
//Burada Email Adresini Güncelliyoruz.
//Böylece null olan değer doluyor.
return _userFromFirebase(_user);
} else {
return null;
}
} else {
return null;
}
}
Author by
Admin
Updated on December 17, 2022Comments
-
Admin over 1 year
Flutter Google Sign In - Email data returns null. Logs are given below. Thank you very much in advance.
I use Firebase.
I want to login with Google, but
AuthResult.user.email == null
------------------------Log error----------------------------
D/FirebaseAuth( 5302): Notifying id token listeners about user ( 9uKLCYS4VwUbuu77KS27bWjKrlI2 ). I/flutter ( 5302): Result : Poyraz Çakmak https://lh3.googleusercontent.com/a-/AAuE7mABS7DqwgoIHuFfIwNw_574FRdvxKuvVyNarFo0_w=s96-c null I/flutter ( 5302): NoSuchMethodError: The method 'indexOf' was called on null. I/flutter ( 5302): Receiver: null I/flutter ( 5302): Tried calling: indexOf("@")
because User model from userName format. => Tried calling: indexOf("@")
GoogleSignIn method:
@override Future<User> login() async { final GoogleSignInAccount googleSignInAccount = await MyToolsFirebase.googleSignIn.signIn(); if (googleSignInAccount != null) { GoogleSignInAuthentication googleSignInAuthentication = await googleSignInAccount.authentication; final String idToken = googleSignInAuthentication.idToken; final String accessToken = googleSignInAuthentication.accessToken; if (idToken != null && accessToken != null) { AuthResult authResult = await MyToolsFirebase.firebaseAuth .signInWithCredential(GoogleAuthProvider.getCredential( idToken: idToken, accessToken: accessToken)); return await MyToolsFirebase.saveDbUser(firebaseUser: authResult.user); } } return null; }
MyToolsFirebase class:
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:google_sign_in/google_sign_in.dart'; import 'package:live_chat/Models/User.dart'; class MyToolsFirebase { static final FirebaseAuth firebaseAuth = FirebaseAuth.instance; static final GoogleSignIn googleSignIn = GoogleSignIn( scopes: <String>[ 'https://www.googleapis.com/auth/contacts.readonly', 'https://www.googleapis.com/auth/plus.login', 'https://www.googleapis.com/auth/userinfo.email' ], ); static final Firestore firestore = Firestore.instance; static User userFromFirebaseUser({@required FirebaseUser firebaseUser}) { if (firebaseUser == null) return null; print("Result : ${firebaseUser.displayName} ${firebaseUser.photoUrl} ${firebaseUser.email}"); return User( uid: firebaseUser.uid, email: firebaseUser.email, name: firebaseUser.displayName, imageURL: firebaseUser.photoUrl, ); } static Future<User> saveDbUser({@required FirebaseUser firebaseUser}) async { User user = userFromFirebaseUser(firebaseUser: firebaseUser); Map userMap = user.toMap(); await firestore.collection("users").document(user.uid).setData(userMap); return await getDbUser(user.uid); } static Future<User> getDbUser(String uid) async { DocumentSnapshot documentSnapshot = await Firestore.instance.collection("users").document(uid).get(); print(User.fromMap(documentSnapshot.data).toString()); return User.fromMap(documentSnapshot.data); } }
User model:
class User { final String uid; String email; String userName; String name; String imageURL; int level; DateTime createdAt; DateTime updatedAt; User({ @required this.uid, @required this.email, this.userName, this.name, this.imageURL, this.level, this.createdAt, this.updatedAt, }); User.fromMap(Map<String, dynamic> map) : this.uid = map["uid"], this.email = map["email"], this.userName = map["userName"], this.name = map["name"], this.imageURL = map["imageURL"], this.level = int.parse(map["level"]), this.createdAt = (map["createdAt"] as Timestamp).toDate(), this.updatedAt = (map["updatedAt"] as Timestamp).toDate(); Map<String, dynamic> toMap() { DateTime now = DateTime.now().toLocal().toUtc(); return { 'uid': this.uid, 'email': this.email, 'userName': this.userName ?? this.email.substring(0, this.email.indexOf("@")) + Random().nextInt(1000).toString(), 'name': this.name, 'imageURL': this.imageURL ?? "https://www.logolynx.com/images/logolynx/61/61ba01858af7f2ea1184238e9f2771f2.png", 'level': this.level ?? 1, 'createdAt': this.createdAt ?? now, 'updatedAt': this.updatedAt ?? now, }; } }
-
anass naoushi about 4 yearsI am facing the same problem. Any solution??
-
Jang Delos Santos almost 4 yearssame here, I can get user.displayName and user.photoUrl but user.email returns null on assert(user.email != null);
-