【问题标题】:How to Signout a user in Flutter with Firebase authentication如何使用 Firebase 身份验证在 Flutter 中注销用户
【发布时间】:2017-12-18 04:00:49
【问题描述】:

我在从我的应用中退出当前用户时遇到问题

我使用的方法如下:

....
onPressed:_signOut
//jump to function


  void _signOut() {
  FirebaseAuth.instance.signOut();
  FirebaseUser user = FirebaseAuth.instance.currentUser;
  //print('$user');
  runApp(
      new MaterialApp(
        home: new LoginPage(),
      )

  );
}

所以现在当我按下按钮时,它应该将用户注销并将他们重定向到他们必须再次登录的主页,但是,重定向发生了,但用户数据仍然会被保存,所以当我按下按钮时再次它会自动使用最后一个帐户再次登录。如何删除用户数据,以便应用在每次注销后尝试登录时询问他们的凭据?

我觉得我在页面之间的链接以及它们的行为如何相应变化方面缺少一些东西,但它是什么?

更新:我使用 google 登录功能和 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,也不会将用户注销。

【问题讨论】:

  • 您可以添加登录小部件的实现吗?您是否清除了用户名/密码/用户的值?
  • 您还可以检查 signOut here 的实现。看起来不错
  • @Mogol 我已经包含了登录页面和登录方法。我不确定这一点,但每当我调用我的登录页面时,我都会尝试将 FirebaseAuth.instance.currentUser.* 设置为空值,但它似乎不起作用,因为这些值没有设置器。
  • google_sign_in 是独立插件,尝试添加 GoogleSignIn.signOut()
  • @Mogol 我相信这在颤振中是无效的,我也相信它应该通过 Firebase 身份验证来完成。

标签: firebase dart firebase-authentication flutter


【解决方案1】:

Firebase 身份验证的 signOut 方法是异步的。你应该让你的_signOut方法async

Future<void> _signOut() async {
  await FirebaseAuth.instance.signOut();
}

以便在用户退出后调用runApp

如果您希望signIn 向用户显示身份验证对话框,而不是静默地自动重新使用当前的 Google 用户,您还应该在注销时调用 _googleSignIn.signOut()

【讨论】:

  • 请检查最后一节我已按照建议添加了异步实现,但是,我似乎无法使其正常工作。
  • 我还没有看到您在 Google 用户上调用 signOut,只有 Firebase 用户。我更新了我的答案以提出这个建议。
  • 非常感谢,这正在工作。我想到了同样的事情,我可能也需要从谷歌退出。据我了解,Firebase 应该处理所有这些,否则如果我必须分别从每个网络(谷歌、Facebook ..)登录和退出,那么包括 Firebase 身份验证有什么意义,请您为我澄清一下吗?跨度>
  • 我确实有这个问题。如果我的应用程序支持,比如说 Google 和 Facebook,我应该单独登录/退出吗?
  • 我在注销时尝试了 _googleSignIn.signOut(),但仍然没有向用户显示身份验证对话框。知道可能是什么原因吗?
【解决方案2】:

你需要有一个 FirebaseAuth 的实例

  final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;

然后

  _signOut() async {
    await _firebaseAuth.signOut();
   }

【讨论】:

    【解决方案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();
                    },
        
                  )
                ),
              ),
            );
          }
        }
    

    你决定。

    【讨论】:

      【解决方案4】:

      如果上面的每个答案都不起作用,则可能页面位于其他所有内容之上,然后使用Navigator.of(context).pop(); 弹出页面。

      我已经搜索了几个小时来寻找一个错误,而不仅仅是因为这个小错误。

      【讨论】:

        【解决方案5】:

        我看过的大多数演示只使用_auth.signOut(); 之类的命令注销 Firebase

        这似乎不再存在(见上面科林的回复):

        _googleSignIn.signOut()
        

        所以,我不得不使用这种方法来注销/注销 Google。

        _googleSignIn.disconnect();
        

        【讨论】:

          【解决方案6】:

          您应该使您的注销功能异步

             Future<void> _signOut() async {
            await FirebaseAuth.instance.signOut();
          }
          

          【讨论】:

            【解决方案7】:

            声明一个 Future 方法来调用注销功能并在注销完成时重定向您的页面:

            Future logout() async {
            await _firebaseAuth.signOut().then((value) => Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context) => LoginPage()),(route) => false))); 
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-05-24
              • 1970-01-01
              • 1970-01-01
              • 2018-12-29
              • 2013-04-05
              • 1970-01-01
              • 1970-01-01
              • 2010-11-04
              相关资源
              最近更新 更多