'Flutter Google Sign In error after canceling Choose an account pop-up

After clicking sign in, choose an account pop comes up but if the user pressed back or outside of the pop-up it throws an error.

Error -

enter image description here

Sign in class -

class GoogleSignInProvider extends ChangeNotifier {
  final googleSignIn = GoogleSignIn();

  GoogleSignInAccount? _user;

  GoogleSignInAccount get user => _user!;

  Future googleLogin() async {
    await googleSignIn.signOut();
    final googleUser = await googleSignIn.signIn();

    if (googleUser == null) return;
    _user = googleUser;

    final googleAuth = await googleUser.authentication;

    final credential = GoogleAuthProvider.credential(
        accessToken: googleAuth.accessToken, idToken: googleAuth.idToken);

    await FirebaseAuth.instance.signInWithCredential(credential);
    notifyListeners();
  }
}

Sign out button -

TextButton(
              onPressed: () async {
                final googleCurrentUser = GoogleSignIn().currentUser;

                if (googleCurrentUser != null) {
                  await GoogleSignIn().disconnect();
                }
                FirebaseAuth.instance.signOut();
                Navigator.pop(context);
              },
              child: const Text(
                'Yes',
                style: TextStyle(color: primaryColor),
              ))


Solution 1:[1]

Instead of if (googleUser == null) return; try using if (googleUser == null) return null;.

Here is my sign in method;

Future<UserCredential?> signInWithGoogle() async {
  final _googleSignIn = GoogleSignIn();
  await _googleSignIn.disconnect().catchError((e, stack) {
    print(e);
  });
    
    final GoogleSignInAccount? googleUser = await _googleSignIn.signIn();

    // handling the exception when cancel sign in
    if (googleUser == null) return null;

    // Obtain the auth details from the request
    final GoogleSignInAuthentication? googleAuth =
        await googleUser.authentication;

    // Create a new credential
    final credential = GoogleAuthProvider.credential(
      accessToken: googleAuth?.accessToken,
      idToken: googleAuth?.idToken,
    );
    return await FirebaseAuth.instance.signInWithCredential(credential);
}

The sign out method;

Future signOut() async {
  var result = await FirebaseAuth.instance.signOut();
  return result;
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1