繁体   English   中英

在 Flutter 应用程序(Google + FireBase)上跳过登录页面

[英]Skip login page on Flutter app(Google + FireBase)

我正在制作一个 Flutter 应用程序,并希望通过 Google 强制登录。 我已将登录后端与登录页面集成在一起。 该应用程序以 SplashScreen 作为根目录开始,然后进入登录页面。 我将如下登录数据发送到 MainScreen。 如果用户已经登录,如何跳过登录页面并直接转到主屏幕?

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'mainscreen.dart';
import 'showup.dart';
import 'dart:async';
import 'dart:io';
import 'package:app_settings/app_settings.dart';

class LoginPage extends StatefulWidget {
  @override
  _LoginPageState createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  int dela = 500;
  final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
  final GoogleSignIn _googleSignIn = GoogleSignIn();

  Future<FirebaseUser> _signIn(BuildContext context) async {
    Scaffold.of(context).showSnackBar(SnackBar(
      content: Text("Opening App..."),
      duration: Duration(seconds: 1),
    ));

    final GoogleSignInAccount googleUser = await _googleSignIn.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 = List<ProviderDetails>();
    providerData.add(providerInfo);

    UserDetails details = UserDetails(
        userDetails.providerId,
        userDetails.displayName,
        userDetails.photoUrl,
        userDetails.email,
        userDetails.phoneNumber,
        providerData);

    Navigator.pushReplacement(
      context,
      CupertinoPageRoute(
          fullscreenDialog: true,
          builder: (context) => MainScreen(detailsUser: details)),
    );
    return userDetails;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.black,
      body: Builder(
        builder: (context) => Padding(
          padding: const EdgeInsets.fromLTRB(15.0, 0, 15, 0),
          child: SingleChildScrollView(
            child: Center(
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[
                  SizedBox(
                    height: 100,
                  ),
                  ShowUp(
                    delay: dela+2000,
                    child: ClipRRect(
                      borderRadius: BorderRadius.circular(20),
                      child: Container(
                        color: Colors.white.withOpacity(0.15),
                        child: SingleChildScrollView(
                          child: Column(
                            crossAxisAlignment: CrossAxisAlignment.center,
                            mainAxisAlignment: MainAxisAlignment.spaceAround,
                            children: <Widget>[
                              SizedBox(
                                height: 20,
                              ),
                              Center(
                                child: Container(
                                  child: Text(
                                    "Welcome",
                                    style: TextStyle(
                                      fontSize: 25,
                                      color: Colors.white,
                                    ),
                                  ),
                                ),
                              ),
                              SizedBox(height: 30),
                              ClipRRect(
                                borderRadius: BorderRadius.circular(30),
                                child: GestureDetector(
                                  onTap: () async {
                                    try{
                                      final result = await InternetAddress.lookup('google.com');
                                      if(result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
                                         _signIn(context)
                                      .then((FirebaseUser user) => print(user))
                                      .catchError((e) => print(e));
                                      }
                                    }on SocketException catch (_) {
                                      showDialog(context: context,
                                        builder: (_) => AlertDialog(
                                          contentPadding: EdgeInsets.fromLTRB(23,28,28,28),
                                          shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
                                          elevation: 10,
                                          backgroundColor: Colors.grey[900],
                                          title: Text("Not Connected",
                                          style: TextStyle(
                                            color: Colors.white,
                                            fontSize: 18,
                                            fontWeight: FontWeight.bold
                                           ),
                                          ),
                                          content: Text("You are not connected to the internet.\n\nCheck your connection and try again",
                                          style: TextStyle(
                                          color: Colors.white,
                                          fontSize: 14)),
                                          actions: <Widget>[
                                           FlatButton(
                                      onPressed: () {
                                        Navigator.pop(context);
                                      },
                                      child: Text("Cancel",
                                      style: TextStyle(
                                        color: Colors.white,
                                      ),)
                                    ),
                                    FlatButton(
                                      onPressed: () {
                                        AppSettings.openDataRoamingSettings();
                                      },
                                      child: Text("Network Settings",
                                      style: TextStyle(color: Colors.red),)
                                    ),
                                  ],
                                        ));
                                    }

                                  },
                                  child: Container(
                                    width: 210,
                                    height: 50,
                                    color: Colors.white,
                                    child: Row(
                                      mainAxisAlignment:
                                          MainAxisAlignment.center,
                                      children: <Widget>[
                                        CircleAvatar(
                                          child: Image.asset(
                                              'Assets/google-logo.png'),
                                          backgroundColor: Colors.white,
                                          radius: 10,
                                        ),
                                        SizedBox(width: 10),
                                        Text("Continue with Google"),
                                      ],
                                    ),
                                  ),
                                ),
                              ),
                              SizedBox(
                                height: 30,
                              ),
                            ],
                          ),
                        ),
                      ),
                    ),
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}

class UserDetails {
  final String provDet;
  final String userName;
  final String photoURL;
  final String userEmail;
  final String userPhone;
  final List<ProviderDetails> providerData;
  UserDetails(this.provDet, this.userName, this.photoURL, this.userEmail,
      this.userPhone, this.providerData);
}

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

我已经在 StackOverFlow 中搜索了答案,但没有找到如何在不通过 LoginPage 登录的情况下将 UserDetails 发送到主屏幕。 有没有办法在不废弃整个代码的情况下完成这项工作?

编辑

这是 mainscreen.dart 的样子

import 'package:flutter/material.dart';
import 'login.dart';

class MainScreen extends StatefulWidget {
  final UserDetails detailsUser;

  MainScreen({Key key, @required this.detailsUser}) : super(key: key);

  @override
  _MainScreenState createState() => _MainScreenState();
}

class _MainScreenState extends State<MainScreen> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.black,
      body: Column (
      children: <Widget>[
      Text(widget.detailsUser.userName),
      Text(widget.detailsUser.userEmail), //basically accessed using widget.detailsUser.whatever
      ]),
      );
     }
     }

1)第一次使用登录时将数据保存到sharedpreferences

2) 在 splachscreen 检查用户是否登录,如果登录,从 sharedpreferences 获取数据并传递给 mainScreen

这是演示...

 var islogin = // put your logic to check user is already login or not

              if(islogin){
                Navigator.pushReplacement(
                  context,
                  MaterialPageRoute(
                    builder: (context) => MainScreen(detailsUser: details),
                  ),
                );
              }else{
                Navigator.pushReplacement(
                  context,
                  MaterialPageRoute(
                    builder: (context) => Login(),
                  ),
                );
              }

在 initState() 中使用 FirebaseAuth ( firebase_auth_plugin )类的 currentUser() 方法。 它会给你当前的用户信息。 它检查当前用户是否为空,这意味着是否已经登录? 我的意思是,如果用户为空则表示未登录,如果不为空则表示已登录。


 await firebaseAuth.currentUser().then((user){ // firebaseUser user
 if(user !=null){
    Navigator.pushReplacement(
      context,
      CupertinoPageRoute(
          fullscreenDialog: true,
          builder: (context) => MainScreen(detailsUser:user)), //navigate your main screen.
    );
 }
}).catchError((e){
print("error:$e");
});

由于它是谷歌登录,我建议将您从 firebase 获得的 Auth 对象传递到登录页面,如果它为空,那么您可以显示登录页面,否则您可以重定向到主屏幕。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM