In Flutter FireBase google sign how to maintain persistence sign for my given code
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
.
yashetty29
Updated on December 20, 2022Comments
-
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 almost 4 yearsYes and it worked
-