In Flutter FireBase google sign how to maintain persistence sign for my given code

428

The main() method is the first method called and it seems that you always go to the LoginPage widget. You can change to a StatefulWidget and check if the user is logged in or not, by using the initState():

  @override
  void initState() {
    super.initState();
    FirebaseAuth.instance.currentUser().then((res) {
      print(res);
      if (res != null) {
        Navigator.pushReplacement(
          context,
          MaterialPageRoute(builder: (context) => Home()),
        );
      }
      else
      {
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => LoginPage()),
        );
      }
    });
  }

For example, here you check if the user is not equal to null, then go to the details page or home page if not then go to the LoginPage.

Share:
428
yashetty29
Author by

yashetty29

Updated on December 20, 2022

Comments

  • yashetty29
    yashetty29 over 1 year

    I my project I am using google sign in and i want to maintain persistent sign in how to do it for the below code. The problem is once i sign in and if i close the app then when I reopen the app i have to sign in again.

    Once I open the app i get an option to Sign in with google once i sign in with google I got to the first screen where details about me the signed in user are available and then if i close the app without signing in then when I restart the application i have to sign in again how should i sign in once and be signed in until i press the sign out button

    main.dart

        import 'package:flutter/material.dart';
    
        import 'login_page.dart';
    
        void main() => runApp(MyApp());
    
        class MyApp extends StatelessWidget {
          @override
          Widget build(BuildContext context) {
            return MaterialApp(
              debugShowCheckedModeBanner: false,
              title: 'Flutter Login',
              theme: ThemeData(
                primarySwatch: Colors.blue,
              ),
              home: LoginPage(),
            );
          }
        }
    

    login_page.dart

    import 'package:chat/sign_in.dart';
        import 'package:flutter/material.dart';
    
        import 'first_screen.dart';
    
        class LoginPage extends StatefulWidget {
          @override
          _LoginPageState createState() => _LoginPageState();
        }
    
        class _LoginPageState extends State<LoginPage> {
          @override
          Widget build(BuildContext context) {
            return Scaffold(
              body: Container(
                color: Colors.white,
                child: Center(
                  child: Column(
                    mainAxisSize: MainAxisSize.max,
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      FlutterLogo(size: 150),
                      SizedBox(height: 50),
                      _signInButton(),
                    ],
                  ),
                ),
              ),
            );
          }
    
          Widget _signInButton() {
            return OutlineButton(
              splashColor: Colors.grey,
              onPressed: () {
                signInWithGoogle().whenComplete(
                  () {
                    Navigator.of(context).push(
                      MaterialPageRoute(
                        builder: (context) {
                          return FirstScreen();
                        },
                      ),
                    );
                  },
                );
              },
              shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(40)),
              highlightElevation: 0,
              borderSide: BorderSide(color: Colors.grey),
              child: Padding(
                padding: const EdgeInsets.fromLTRB(0, 10, 0, 10),
                child: Row(
                  mainAxisSize: MainAxisSize.min,
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Image(image: AssetImage("assets/google_logo.png"), height: 35.0),
                    Padding(
                      padding: const EdgeInsets.only(left: 10),
                      child: Text(
                        'Sign in with Google',
                        style: TextStyle(
                          fontSize: 20,
                          color: Colors.grey,
                        ),
                      ),
                    )
                  ],
                ),
              ),
            );
          }
        }
    

    sign_in.dart

    import 'package:firebase_auth/firebase_auth.dart';
    import 'package:google_sign_in/google_sign_in.dart';
    
    final FirebaseAuth _auth = FirebaseAuth.instance;
    final GoogleSignIn googleSignIn = GoogleSignIn();
    
    String name;
    String email;
    String imageUrl;
    Future<String> signInWithGoogle() async {
      final GoogleSignInAccount googleSignInAccount = await googleSignIn.signIn();
      final GoogleSignInAuthentication googleSignInAuthentication =
          await googleSignInAccount.authentication;
    
      final AuthCredential credential = GoogleAuthProvider.getCredential(
        accessToken: googleSignInAuthentication.accessToken,
        idToken: googleSignInAuthentication.idToken,
      );
    
      final AuthResult authResult = await _auth.signInWithCredential(credential);
      final FirebaseUser user = authResult.user;
    
      // Checking if email and name is null
      assert(user.email != null);
      assert(user.displayName != null);
      assert(user.photoUrl != null);
    
      name = user.displayName;
      email = user.email;
      imageUrl = user.photoUrl;
    
      // Only taking the first part of the name, i.e., First Name
      if (name.contains(" ")) {
        name = name.substring(0, name.indexOf(" "),);
      }
    
      assert(!user.isAnonymous);
      assert(await user.getIdToken() != null);
    
      final FirebaseUser currentUser = await _auth.currentUser();
      assert(user.uid == currentUser.uid);
    
      return 'signInWithGoogle succeeded: $user';
    }
    
    void signOutGoogle() async {
      await googleSignIn.signOut();
    
      print("User Sign Out");
    }
    

    first_screen.dart

    import 'package:chat/login_page.dart';
    import 'package:chat/sign_in.dart';
    import 'package:flutter/material.dart';
    
    class FirstScreen extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Container(
            decoration: BoxDecoration(
              gradient: LinearGradient(
                begin: Alignment.topRight,
                end: Alignment.bottomLeft,
                colors: [Colors.blue[100], Colors.blue[400]],
              ),
            ),
            child: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                mainAxisSize: MainAxisSize.max,
                children: <Widget>[
                  CircleAvatar(
                    backgroundImage: NetworkImage(
                      imageUrl,
                    ),
                    radius: 60,
                    backgroundColor: Colors.transparent,
                  ),
                  SizedBox(height: 40),
                  Text(
                    'NAME',
                    style: TextStyle(
                        fontSize: 15,
                        fontWeight: FontWeight.bold,
                        color: Colors.black54),
                  ),
                  Text(
                    name,
                    style: TextStyle(
                        fontSize: 25,
                        color: Colors.deepPurple,
                        fontWeight: FontWeight.bold),
                  ),
                  SizedBox(height: 20),
                  Text(
                    'EMAIL',
                    style: TextStyle(
                        fontSize: 15,
                        fontWeight: FontWeight.bold,
                        color: Colors.black54),
                  ),
                  Text(
                    email,
                    style: TextStyle(
                        fontSize: 25,
                        color: Colors.deepPurple,
                        fontWeight: FontWeight.bold),
                  ),
                  SizedBox(height: 40),
                  RaisedButton(
                    onPressed: () {
                      signInWithGoogle();
                      Navigator.of(context).pushAndRemoveUntil(
                        MaterialPageRoute(
                          builder: (context) {
                            return LoginPage();
                          },
                        ),
                        ModalRoute.withName('/'),
                      );
                    },
                    color: Colors.deepPurple,
                    child: Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: Text(
                        'Sign Out',
                        style: TextStyle(fontSize: 25, color: Colors.white),
                      ),
                    ),
                    elevation: 5,
                    shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(40)),
                  )
                ],
              ),
            ),
          ),
        );
      }
    }
    
    • yashetty29
      yashetty29 almost 4 years
      Yes and it worked