如何使用 Firebase 身份验证在 Flutter 中注销用户

How to Signout a user in Flutter with Firebase authentication

我在从我的应用中注销当前用户时遇到问题

我使用的方法如下:

....
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,也不会将用户注销。

Firebase auth 的 signOut 方法是异步的。你应该让你的 _signOut 方法 async.

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

以便在用户注销后调用 runApp

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

您需要有一个 FirebaseAuth 实例

  final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;

然后

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

我看过的大多数演示都只使用 _auth.signOut();

这样的命令注销 Firebase

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

_googleSignIn.signOut()

所以,我不得不用这个方法来 signout/logout of Google。

_googleSignIn.disconnect();

首先像这样创建一个 FirebaseAuth 实例

 FirebaseAuth auth = FirebaseAuth.instance;

然后将其添加到您的注销按钮或您希望用于注销的任何方式。

signOut() async {
    await auth.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();
                },
    
              )
            ),
          ),
        );
      }
    }

你来决定。

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

我搜索了几个小时来寻找一个错误,而这个错误甚至不存在,只是为了这个小错误。

你应该让你的注销函数异步

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

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

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