How to check if user is already logged in using Google Sign in and Firebase Auth to retrieve their data?

自闭症网瘾萝莉.ら 提交于 2021-02-08 15:27:53

问题


I have a simple game made in Flutter and I can log in the user but I don't know how to check if the user is logged and how to get user's data if so.

For log in I am using this method, after log in the user I can get his data:

Future<String> signInWithGoogle() async{

    print("INICIALIZANDO LOGIN COM GOOGLE...");

    googleSignInAccount = await googleSignIn.signIn();
    googleSignInAuthentication = await googleSignInAccount.authentication;

    final AuthCredential credential = GoogleAuthProvider.getCredential(
        accessToken: googleSignInAuthentication.accessToken,
        idToken: googleSignInAuthentication.idToken,

    );

    AuthResult authResult = await _auth.signInWithCredential(credential);

    user = authResult.user;

    assert(!user.isAnonymous);
    assert(await user.getIdToken() != null);

    currentUser = await _auth.currentUser();
    assert(user.uid == currentUser.uid);

    uid = user.uid;
    name = user.displayName;
    email = user.email;
    imageUrl = user.photoUrl;

    print(uid);
    print(email);
    print(name);
    print(imageUrl);

    return 'signInWithGoogle succeded: $user';

  }

And for signOut this:

  void signOutGoogle() async{

    print("DESLOGOU!");
  await googleSignIn.signOut();

  }

回答1:


MyAppClient.dart

Future getCurrentUser() async {
FirebaseUser _user = await FirebaseAuth.instance.currentUser();
print("User: ${_user.displayName ?? "None"}");
return _user;}

Main.dart

return MaterialApp(
  title: 'Flutter Demo',
  theme: ThemeData(
    primarySwatch: GSTheme.backgroundColor,
  ),
  debugShowCheckedModeBanner: false,
  home: MyAppClient().getCurrentUser() != null
      ? HomeViewController()
      : LoginViewController(),
);



回答2:


in my case while checking if a user is logged in i use a rootscreen which is just a blank page and the user barely sees it . here is my code

     class RootScreen extends StatefulWidget {
      @override
      State<StatefulWidget> createState() => new _RootScreenState();
    }

    class _RootScreenState extends State<RootScreen> {
      @override 
      Widget build(BuildContext context) {
        return new StreamBuilder<FirebaseUser>(
          stream: FirebaseAuth.instance.onAuthStateChanged,
          builder: (BuildContext context, snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return new Container(
                color: Colors.white,
              );
            } else {
              if (snapshot.hasData) {
//user is logged in
                return new MainScreen(
                  firebaseUser: snapshot.data,
                );
              } else {
//user not logged in
                return Login();
              }
            }
          },
        );
      }
    }

for getting user data

class MainScreen extends StatelessWidget {
  final GoogleSignInAccount googleUser;
  final FirebaseUser firebaseUser;

  const MainScreen(
      {Key key, @required this.googleUser, @required this.firebaseUser})
      : assert(googleUser != null),
        assert(firebaseUser != null),
        super(key: key);

  @override
  Widget build(BuildContext context) {
    final theme = Theme.of(context);
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            Offstage(
              offstage: firebaseUser.photoUrl == null,
              child: CircleAvatar(
                  backgroundImage: NetworkImage(firebaseUser.photoUrl)),
            ),
            SizedBox(height: 8.0),
            Text(firebaseUser.displayName, style: theme.textTheme.title),
            Text(firebaseUser.email),
            Text(firebaseUser.phoneNumber, style: theme.textTheme.subhead),
            SizedBox(height: 16.0),
            FlatButton(
              child: Text("Sign out", style: theme.textTheme.button),
              onPressed: () async {
                await GoogleSignIn().signOut();
                await FirebaseAuth.instance.signOut();
                Navigator.of(context).pushAndRemoveUntil(
                  CupertinoPageRoute(builder: (context) => AuthScreen()),
                  (route) => false,
                );
              },
            )
          ],
        ),
      ),
    );
  }
}


来源:https://stackoverflow.com/questions/57649410/how-to-check-if-user-is-already-logged-in-using-google-sign-in-and-firebase-auth

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!