Firebase 身份验证颤动
Posted
技术标签:
【中文标题】Firebase 身份验证颤动【英文标题】:Firebase auth flutter 【发布时间】:2020-10-23 04:28:59 【问题描述】:对于已登录的用户
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;
assert(!user.isAnonymous);
assert(await user.getIdToken() != null);
final FirebaseUser currentUser = await _auth.currentUser();
assert(user.uid == currentUser.uid);
if(authResult.additionalUserInfo.isNewUser == true)
InsertNewUserDetails(user.displayName,user.email,user.photoUrl,user.phoneNumber);
if(authResult.user != null)
email = user.email;
name = user.displayName;
imageUrl =user.photoUrl;
globalInstance.isLoggedIn = true;
print(globalInstance.isLoggedIn);
return 'signInWithGoogle succeeded: $user';
第一次登录登录页面检查是否已登录帐户
class MyApp extends StatelessWidget
@override
String strinbggg;
Widget build(BuildContext context)
// TODO: implement build
return MaterialApp(
home: Scaffold(
backgroundColor: Colors.teal,
body: StreamBuilder<FirebaseUser>(
stream: FirebaseAuth.instance.onAuthStateChanged,
builder: (BuildContext context, snapshot)
if (snapshot.hasData && (!snapshot.data.isAnonymous))
// return Text('$snapshot.hasData');
return Homepage();
else
// return SafeArea(
// maintainBottomViewPadding: true,
// child: Text('aasdasdfasfdh : $snapshot.data.email',style: TextStyle(color: Colors.black54),));
return LoginPage();
,
),
),
);
当第一次使用谷歌登录时,它的工作原理。当我关闭应用程序并重新启动时,它会很好地重定向到主页,但用户个人资料详细信息(如 displayName 、电子邮件)返回空值
signInwithgoogle() 用于首次登录,将用户详细信息存储在 firestore 中,并从此处设置用户详细信息
MyApp 是应用程序的起点,将检查用户是否已登录
【问题讨论】:
能否请您在启动应用程序时显示您正在检查登录状态的代码? body: StreamBuilder我建议,你检查用户是否已经登录或没有使用该方法
bool isSignedIn = await _googleSignIn.isSignedIn();
如果用户已登录,则使用获取凭据
user = await _auth.currentUser();
当您启动应用程序时。如果您没有登录,请显示登录页面。任何示例都如下所示
final auth = FirebaseAuth.instance;
class MyApp extends StatelessWidget
@override
String strinbggg;
Widget build(BuildContext context)
return MaterialApp(
home: (_isSignedIn() == true ? new Homepage() : new LoginPage()));
bool _isSignedIn() async
bool isSignedIn = await _googleSignIn.isSignedIn();
if(isSignedIn)
GoogleSignInAccount user = await auth.currentUser;
//You can store this in your state.
return !(user == null && auth.currentUser == null);
请注意,这是一个在编辑器中编写的代码,未经测试,您必须进行调整。
【讨论】:
您可以将您的流移动到主页内,这样当用户退出时,您可以重定向回登录以上是关于Firebase 身份验证颤动的主要内容,如果未能解决你的问题,请参考以下文章
使用refreshToken颤动firebase自动刷新用户会话