Flutter Authentication 从登录屏幕到登录屏幕使用 Google 登录和注销
Posted
技术标签:
【中文标题】Flutter Authentication 从登录屏幕到登录屏幕使用 Google 登录和注销【英文标题】:Flutter Authentication sign in & sign out with Google from logged screen to login screen 【发布时间】:2019-05-29 15:34:25 【问题描述】:今天我尝试构建 2 个屏幕“使用 GG 登录”和“注销重定向到登录屏幕”。成功!但是当我再次登录时,以前的 gg 帐户立即登录,而无需弹出登录。在我的设备上记住登录的帐户。如何完全退出并使用其他帐户重新登录。这是我的代码: 我有“使用谷歌登录的主页”和“带有注销按钮的主页中心页面”。此外,我有 api.dart 登录和注销,主页使用路由到 2 个页面。 - 主页:
routes:
"home-page": (context) => MyHomePage(),
"game-center": (context) => GameCenterPage(),
,
home: MyHomePage(),
- Api.dart:
class FBApi
static FirebaseAuth _auth = FirebaseAuth.instance;
static GoogleSignIn _googleSignIn = GoogleSignIn();
FirebaseUser firebaseUser;
FBApi(FirebaseUser user)
this.firebaseUser = user;
static Future<FBApi> signInWithGoogle() async
final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
final GoogleSignInAuthentication googleAuth = await googleUser.authentication;
final FirebaseUser user = await _auth.signInWithGoogle(
accessToken: googleAuth.accessToken,
idToken: googleAuth.idToken,
);
assert(user.email != null);
assert(user.displayName != null);
assert(await user.getIdToken() != null);
final FirebaseUser currentUser = await _auth.currentUser();
assert(user.uid == currentUser.uid);
return FBApi(user);
static Future<void> signOut() async
await _auth.signOut().then((_)
print("***** log out...what the hell?");
// Navigator.of(context).pushNamedAndRemoveUntil("/login",
ModalRoute.withName("/home"));
);
-gameCenter.dart:
onPressed: () async
_signOut();
Navigator.of(context).pushNamedAndRemoveUntil("home-page", ModalRoute.withName("game-center"));
,
- home.dart
class MyHomePage extends StatelessWidget
Future<bool> _loginUser() async
final api = await FBApi.signInWithGoogle();
if (api != null)
return true;
else
return false;
...
【问题讨论】:
【参考方案1】:本周末我遇到了类似的问题,并通过退出 GoogleSignIn 解决了这个问题 - 但是我不确定这是否是正确的方法,因为我希望 FirbaseAuth 自动退出所有提供商。
static Future<void> signOut() async
await _auth.signOut().then((_)
//try the following
_googleSignIn.signOut();
//try the following
Navigator.of(context).pushNamedAndRemoveUntil("/login", ModalRoute.withName("/home"));
);
【讨论】:
太棒了!我忘了我只是注销身份验证,而不是注销帐户。非常感谢 关闭应用或退出应用后如何立即退出?【参考方案2】:如果您对 Google SignIn 的登录弹出窗口有疑问,请在退出呼叫后执行此操作
Navigator.pushReplacement(
(context), MaterialPageRoute(builder: (context) => widget));
【讨论】:
【参考方案3】:用户从 Firebase 退出,而不是从 Google 退出。
所以下次你已经有一个用户登录并且由GoogleSignIn()
返回。
您还需要退出 Google。以下对我来说非常有效:
Future signOut() async
try
await _fireBaseAuthInstance.signOut();
await _googleSignInInstance.signOut();
catch (e)
print('Failed to signOut' + e.toString());
【讨论】:
以上是关于Flutter Authentication 从登录屏幕到登录屏幕使用 Google 登录和注销的主要内容,如果未能解决你的问题,请参考以下文章
Flutter Authentication 从登录屏幕到登录屏幕使用 Google 登录和注销
Flutter/Firebase:管理功能是应用内功能还是云功能?