如何使用Firebase身份验证在Flatter中注销用户
我从我的应用程序注销当前用户时遇到问题 我使用的方法如下:如何使用Firebase身份验证在Flatter中注销用户,firebase,dart,firebase-authentication,flutter,Firebase,Dart,Firebase Authentication,Flutter,我从我的应用程序注销当前用户时遇到问题 我使用的方法如下: .... onPressed:_signOut //jump to function void _signOut() { FirebaseAuth.instance.signOut(); FirebaseUser user = FirebaseAuth.instance.currentUser; //print('$user'); runApp( new MaterialApp( ho
....
onPressed:_signOut
//jump to function
void _signOut() {
FirebaseAuth.instance.signOut();
FirebaseUser user = FirebaseAuth.instance.currentUser;
//print('$user');
runApp(
new MaterialApp(
home: new LoginPage(),
)
);
}
Future <LoginPage> _signOut() async{
await FirebaseAuth.instance.signOut();
return new LoginPage();
}
因此,现在当我按下按钮时,它应该注销用户并将他们重定向到主页,他们将不得不再次登录,然而,重定向发生了,但用户数据仍将保存,因此当我再次按下按钮时,它会自动使用最后一个帐户再次登录。如何删除用户数据,以便应用程序在每次注销后尝试登录时询问他们的凭据
我觉得我在页面之间的链接中遗漏了一些东西,以及它们的行为如何相应地改变,但这是什么呢
更新:我使用带有firebase身份验证的google登录功能
Future<String> _testSignInWithGoogle() 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(!user.isAnonymous);
assert(await user.getToken() != null);
return 'signInWithGoogle succeeded: $user';
}
Future\u testSignInWithGoogle()异步{
final GoogleSignInAccount googleUser=wait_googleSignIn.signIn();
最终谷歌签名认证=
等待googleUser.authentication;
最终FirebaseUser用户=等待_auth.signiWithGoogle(
accessToken:googleAuth.accessToken,
idToken:googleAuth.idToken,
);
断言(user.email!=null);
断言(user.displayName!=null);
断言(!user.isAnonymous);
断言(wait user.getToken()!=null);
返回'signInWithGoogle successed:$user';
}
我的登录页面如下所示:
class LoginPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("Login"), backgroundColor: Colors.blue,),
body: new Container(
child: new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new IconButton(
icon: new Icon(Icons.account_box, color: Colors.red),
onPressed: _signIn,
iconSize: 80.0,),
new Text("Google Signin")
],
)
)
)
);
}
}
类登录页面扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(
标题:新文本(“登录”),背景颜色:Colors.blue,),
主体:新容器(
孩子:新中心(
子:新列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
新图标按钮(
图标:新图标(Icons.account\u框,颜色:Colors.red),
按下按钮:_sign,
iconSize:80.0,),
新文本(“谷歌登录”)
],
)
)
)
);
}
}
更新:将_signOut()方法更改为异步,如下所示:
....
onPressed:_signOut
//jump to function
void _signOut() {
FirebaseAuth.instance.signOut();
FirebaseUser user = FirebaseAuth.instance.currentUser;
//print('$user');
runApp(
new MaterialApp(
home: new LoginPage(),
)
);
}
Future <LoginPage> _signOut() async{
await FirebaseAuth.instance.signOut();
return new LoginPage();
}
Future\u signOut()异步{
等待FirebaseAuth.instance.signOut();
返回新的登录页面();
}
现在,当我按下“注销”按钮时,它不会将我重定向到登录页面,也不会注销用户。Firebase auth的
注销方法是异步的。您应该使您的\u签出方法async
Future\u signOut()异步{
等待FirebaseAuth.instance.signOut();
}
因此,对runApp
的调用在用户注销后发生
如果您希望signIn
向用户显示身份验证对话框,而不是静默地自动重新使用当前Google用户,则在注销时还应调用\u googleSignIn.signOut()
。您需要一个FirebaseAuth实例
final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
然后
_signOut() async {
await _firebaseAuth.signOut();
}
我看过的大多数演示仅使用\u auth.signOut()之类的命令注销Firebase代码>
这似乎已经不存在了(见上文Collin的回复):
所以,我不得不用这个方法注销/注销谷歌
_googleSignIn.disconnect();
首先创建一个FirebaseAuth实例,如下所示
FirebaseAuth auth = FirebaseAuth.instance;
然后将其添加到您的注销按钮或您希望用于注销的任何方式
signOut() async {
await auth.signOut();
}
您还可以创建一个函数,然后在按钮中调用signOut,如下所示
import 'package:flutter/material.dart';
class SignOut extends StatefulWidget {
@override
_ SignOut State createState() => _ SignOut State();
}
class _ SignOut State extends State< SignOut > {
FirebaseAuth auth = FirebaseAuth.instance;
signOut() async {
await _firebaseAuth.signOut();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: Center(
child: Container(
child: RaisedButton(
onPressed: () {
signOut();
},
)
),
),
);
}
}
导入“包装:颤振/材料.省道”;
类签出扩展了StatefulWidget{
@凌驾
_签出状态createState()=>uu签出状态();
}
类uuSignout状态扩展状态{
FirebaseAuth auth=FirebaseAuth.instance;
signOut()异步{
等待_firebaseAuth.signOut();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
背景颜色:Colors.white,
正文:中(
子:容器(
孩子:升起按钮(
已按下:(){
签出();
},
)
),
),
);
}
}
你自己决定。如果上面的每一个答案都不起作用,那么可能有一个页面位于其他所有页面之上,然后使用Navigator.of(context).pop()
弹出页面
我花了好几个小时寻找一个甚至不存在的错误,只是为了这个小错误。您应该使您的注销功能异步
Future<void> _signOut() async {
await FirebaseAuth.instance.signOut();
}
Future\u signOut()异步{
等待FirebaseAuth.instance.signOut();
}
能否添加登录小部件的实现?是否清除用户名/密码/用户的值?还可以检查注销的实现。看起来ok@Mogol我已经包括了登录页面和登录方法。我不确定这一点,但每当我调用我的登录页面时,我都试图将FirebaseAuth.instance.currentUser.*设置为空值,但似乎不起作用,因为这些值没有设置程序。google_sign_是单独的插件,尝试添加GoogleSignIn.signOut()@Mogol我相信这在Flatter中无效,另外,我认为应该通过Firebase身份验证来完成。请查看最后一节,我已经按照建议添加了异步实现,但是,我似乎没有让它正常工作。我还没有看到你在Google用户上调用注销
,只有Firebase一个。我更新了我的答案,建议这样做。非常感谢,这是工作。我想到了同样的事情,我可能也需要从谷歌注销。据我所知,Firebase应该处理所有这些问题,否则,如果我必须分别从每个网络(谷歌、facebook等)登录和注销Firebase身份验证有什么意义,请你为我澄清一下,好吗?我确实有这个问题。。如果我的应用程序支持谷歌和Facebook,我应该单独登录/退出吗?我试过了_googlesign.signOut()wh