How To Show Login Page if user has not logged in and Show Account Page if user is logged in

0

I created a Buttom navBar And Added 5 tabs. Here any user can come and Explore, and if he wants to create an account he can do it in the account section. When User presses The account page, If the user has not logged in before I want to show login Page, else if User has logged in I want to show His account Info page. I don't want to route to other pages When the user presses the Login Button. I want The data to be shown on the same page.

Account Page Main

class UserAccountInfo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

If the user is not logged in He will be shown this Page

class GoogleSignApp extends StatefulWidget {
  @override
  _GoogleSignAppState createState() => _GoogleSignAppState();
}

class _GoogleSignAppState extends State<GoogleSignApp> {
  final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
  final GoogleSignIn _googlSignIn = new GoogleSignIn();

  Future<FirebaseUser> _signIn(BuildContext context) async {
    Scaffold.of(context).showSnackBar(new SnackBar(
      content: new Text('Sign in'),
    ));

    final GoogleSignInAccount googleUser = await _googlSignIn.signIn();
    final GoogleSignInAuthentication googleAuth =
        await googleUser.authentication;

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

    FirebaseUser userDetails =
        (await _firebaseAuth.signInWithCredential(credential)).user;
    ProviderDetails providerInfo = new ProviderDetails(userDetails.providerId);

    List<ProviderDetails> providerData = new List<ProviderDetails>();
    providerData.add(providerInfo);

    UserDetails details = new UserDetails(
      userDetails.providerId,
      userDetails.displayName,
      userDetails.photoUrl,
      userDetails.email,
      providerData,
    );
    Navigator.push(
      context,
      new MaterialPageRoute(builder: (context) {
        return ProfileScreen(detailsUser: details);
      }),
    );
    return userDetails;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Builder(
        builder: (context) => Stack(
          fit: StackFit.expand,
          children: <Widget>[
            Container(
              width: MediaQuery.of(context).size.width,
              height: MediaQuery.of(context).size.height,
              color: Colors.limeAccent,
            ),
            Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                SizedBox(height: 10.0),
                Container(
                    width: 250.0,
                    child: Align(
                      alignment: Alignment.center,
                      child: RaisedButton(
                        shape: RoundedRectangleBorder(
                            borderRadius: new BorderRadius.circular(30.0)),
                        color: Color(0xffffffff),
                        child: Row(
                          mainAxisAlignment: MainAxisAlignment.start,
                          children: <Widget>[
                            Icon(
                              Icons.lock_open,
                              color: Color(0xffCE107C),
                            ),
                            SizedBox(width: 10.0),
                            Text(
                              'Sign in with Google',
                              style: TextStyle(
                                  color: Colors.black, fontSize: 18.0),
                            ),
                          ],
                        ),
                        onPressed: () => _signIn(context)
                            .then((FirebaseUser user) => print(user))
                            .catchError((e) => print(e)),
                      ),
                    )),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

class UserDetails {
  final String providerDetails;
  final String userName;
  final String photoUrl;
  final String userEmail;
  final List<ProviderDetails> providerData;

  UserDetails(this.providerDetails, this.userName, this.photoUrl,
      this.userEmail, this.providerData);
}

class ProviderDetails {
  ProviderDetails(this.providerDetails);
  final String providerDetails;
}

If the user is logged in he will be shown this page

class ProfileScreen extends StatelessWidget {
  final UserDetails detailsUser;

  ProfileScreen({Key key, this.detailsUser}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final GoogleSignIn _gSignIn = GoogleSignIn();

    return Scaffold(
      appBar: AppBar(
        title: Text(detailsUser.userName),
        automaticallyImplyLeading: false,
        actions: <Widget>[
          IconButton(
            icon: Icon(
              Icons.delete,
              size: 20.0,
              color: Colors.white,
            ),
            onPressed: () {
              _gSignIn.signOut();
              print('Signed out');
              Navigator.pop(context);
            },
          ),
        ],
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            CircleAvatar(
              backgroundImage: NetworkImage(detailsUser.photoUrl),
              radius: 50.0,
            ),
            SizedBox(height: 10.0),
            Text(
              "Name : " + detailsUser.userName,
              style: TextStyle(
                  fontWeight: FontWeight.bold,
                  color: Colors.black,
                  fontSize: 20.0),
            ),
            SizedBox(height: 10.0),
            Text(
              "Email : " + detailsUser.userEmail,
              style: TextStyle(
                  fontWeight: FontWeight.bold,
                  color: Colors.black,
                  fontSize: 20.0),
            ),
            SizedBox(height: 10.0),
            Text(
              "Provider : " + detailsUser.providerDetails,
              style: TextStyle(
                  fontWeight: FontWeight.bold,
                  color: Colors.black,
                  fontSize: 20.0),
            ),
          ],
        ),
      ),
    );
  }
}
flutter
dart
flutter-layout
asked on Stack Overflow Jul 21, 2020 by Jeevan Crasta

2 Answers

0

You can do this like that.

if (await FirebaseAuth.instance.currentUser() != null) {

    // push to account page
} else {
    //Stay or push to login page
}
answered on Stack Overflow Jul 21, 2020 by Filip
0

You would need to do that using the splash page to keep the UI clean and good. The following code should help you achieve what you are looking for. Streambuilder help you create track on login changed status to know change any access tokens like FCM.

  @override
  Widget build(BuildContext context) {
  return ChangeNotifierProvider(
  create: (context) => UserData(),
  child: MaterialApp(
    title: 'Default App',
    debugShowCheckedModeBanner: false,
    theme: ThemeData(
        primaryIconTheme: Theme.of(context)
            .primaryIconTheme
            .copyWith(color: Colors.white)),
    home: _getScreenID(),
    routes: {
      LoginScreen.id: (context) => LoginScreen(),
    },
  ),
);

}

Widget _getScreenID() {
return StreamBuilder<FirebaseUser>(
  stream: FirebaseAuth.instance.onAuthStateChanged,
  builder: (BuildContext context, snapshot) {
    if (snapshot.hasData) {
      Provider.of<UserData>(context).currentUserId = snapshot.data.uid;
      return Home_Page();
    } else {
      return Login_Page();
    }
  },
);

}

answered on Stack Overflow Jul 21, 2020 by Lohit Rachakonda

User contributions licensed under CC BY-SA 3.0