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;
    }
  }
Share:
2,363
Admin
Author by

Admin

Updated on December 17, 2022

Comments

  • Admin
    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
      anass naoushi about 4 years
      I am facing the same problem. Any solution??
    • Jang Delos Santos
      Jang Delos Santos almost 4 years
      same here, I can get user.displayName and user.photoUrl but user.email returns null on assert(user.email != null);