我在从我的应用中退出当前用户时遇到问题
我使用的方法如下:
....
onPressed:_signOut
//jump to function
void _signOut() {
FirebaseAuth.instance.signOut();
FirebaseUser user = FirebaseAuth.instance.currentUser;
//print('$user');
runApp(
new MaterialApp(
home: new LoginPage(),
)
);
}
所以现在当我按下按钮时,它应该将用户签名并将其重定向到他们必须再次登录的主页,但是,重定向发生但用户数据仍然会被保存,所以当我按下按钮时再次使用最后一个帐户自动重新登录。如何删除用户数据,以便应用程序在每次注销后尝试登录时询问他们的凭据?
我觉得我错过了页面之间的联系以及他们的行为如何相应地改变的东西,但是它是什么?
更新:我使用gobase登录功能进行firebase身份验证
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';
}
我的登录页面如下所示:
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")
],
)
)
)
);
}
}
更新:将_signOut()方法更改为异步,如下所示:
Future <LoginPage> _signOut() async{
await FirebaseAuth.instance.signOut();
return new LoginPage();
}
现在当我按下注销时,它不会将我重定向到LoginPagae,也不会签署用户。
答案 0 :(得分:7)
Firebase身份验证signOut
方法是异步的。您应该使用_signOut
方法async
并致电await FirebaseAuth.instance.signOut();
,以便在用户退出后调用runApp
。
如果您希望_googleSignIn.signOut()
向用户显示身份验证对话框,而非静默并自动重新使用当前的Google用户,则还应在退出时致电signIn
。
答案 1 :(得分:3)
首先像这样创建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();
},
)
),
),
);
}
}
您决定。
答案 2 :(得分:0)
您需要具有FirebaseAuth实例
final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
然后
_signOut() async {
await _firebaseAuth.signOut();
}
答案 3 :(得分:0)
我只看过使用_auth.signOut();
这样的命令注销Firebase的大多数演示
这似乎不再存在(请参阅上面的Collin答复):
_googleSignIn.signOut()
因此,我不得不使用这种方法来注销/注销Google。
_googleSignIn.disconnect();
答案 4 :(得分:0)
如果上面的每个答案都行不通,则可能是页面在其他所有内容之上,然后使用Navigator.of(context).pop();
弹出页面。
我已经花了几个小时寻找一个错误,而这个错误并不仅仅是因为这个小错误。
答案 5 :(得分:0)
你应该让你的退出函数异步
Future<void> _signOut() async {
await FirebaseAuth.instance.signOut();
}
答案 6 :(得分:0)
声明一个 Future 方法来调用注销函数并在注销完成后重定向您的页面:
Future logout() async {
await _firebaseAuth.signOut().then((value) => Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context) => LoginPage()),(route) => false)));
}