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

cidc1ykv  于 2023-03-10  发布在  Flutter
关注(0)|答案(8)|浏览(192)

从我的应用注销当前用户时遇到问题
我使用的方法如下:

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

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

  );
}

现在,当我按下按钮,它应该注销用户,并将他们重定向到主页,他们将不得不再次登录,然而,重定向发生,但用户数据仍然会保存,所以当我再次按下按钮,它会自动登录与最后一个帐户再次。我如何删除用户数据,使应用程序询问他们的凭据,每次他们尝试登录后注销?
我觉得我在页面之间的链接以及它们的行为如何相应地变化中遗漏了一些东西,但那是什么呢?
更新:我使用谷歌登录功能与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,也不会注销用户。

ugmeyewa

ugmeyewa1#

Firebase auth的signOut方法是异步的。您应该使您的_signOut方法为async

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

以便对runApp的调用发生在用户退出之后。
如果您希望signIn向用户显示身份验证对话框,而不是静默地自动重用当前Google用户,则还应该在注销时调用_googleSignIn.signOut()

ifmq2ha2

ifmq2ha22#

您需要有FirebaseAuth的示例

final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;

然后

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

t8e9dugd3#

我看过的大多数演示只使用_auth.signOut();之类的命令注销Firebase
这似乎不再存在了(见柯林的答复以上):

_googleSignIn.signOut()

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

_googleSignIn.disconnect();
polhcujo

polhcujo4#

首先创建一个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();
                },
    
              )
            ),
          ),
        );
      }
    }

"你决定吧“

33qvvth1

33qvvth15#

如果上面的每个答案都不起作用,可能是一个页面放在其他所有东西之上,然后使用Navigator.of(context).pop();弹出页面。
我找了几个小时找一个根本不存在的错误就为了这个小错误。

6yt4nkrj

6yt4nkrj6#

应该使注销函数异步

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

55ooxyrt7#

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

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

643ylb088#

这对我很有效

TextButton(
                  onPressed: () async {
                    final navigator = Navigator.of(context);
                    await CacheHelper.removeData(key: AppConstants.userKey);
                    await GoogleSignIn().signOut();

                    navigator.pushAndRemoveUntil(MaterialPageRoute(
                        builder: (c) => const GoogleAuthScreen()),(route)=>false);
                  },

相关问题