Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Firebase身份验证在Flatter中注销用户_Firebase_Dart_Firebase Authentication_Flutter - Fatal编程技术网

如何使用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