[英]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.