Flutter Authentication从登录屏幕登录到登录屏幕并使用Google注销

时间:2019-01-03 02:36:23

标签: firebase flutter firebase-authentication google-signin

今天,我尝试构建2个屏幕“使用GG登录”和“注销重定向到登录屏幕”。成功!但是,当我再次登录时,Previous gg帐户无需登录弹出窗口即可立即登录。在我的设备上,请记住已登录的帐户。如何完全退出并再次使用其他帐户登录。这是我的代码: 我有“使用Google登录的首页”和“使用退出按钮的首页中心页面”。此外,我有api.dart可以登录和注销,并且主页使用指向2页的路由。 -主页:

routes: {
    "home-page": (context) => MyHomePage(),
    "game-center": (context) => GameCenterPage(),
  },
  home: MyHomePage(),

-Api.dart:

class FBApi {
  static FirebaseAuth _auth = FirebaseAuth.instance;
  static GoogleSignIn _googleSignIn = GoogleSignIn();

  FirebaseUser firebaseUser;

  FBApi(FirebaseUser user) {
    this.firebaseUser = user;
  }

  static Future<FBApi> signInWithGoogle() 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(await user.getIdToken() != null);

    final FirebaseUser currentUser = await _auth.currentUser();
    assert(user.uid == currentUser.uid);

    return FBApi(user);
  }

  static Future<void> signOut() async {
    await _auth.signOut().then((_) {
      print("***** log out...what the hell?");
      // Navigator.of(context).pushNamedAndRemoveUntil("/login", 
ModalRoute.withName("/home"));
    });
  }
}

-gameCenter.dart:

onPressed: () async {
          _signOut();
          Navigator.of(context).pushNamedAndRemoveUntil("home-page", ModalRoute.withName("game-center"));
        },

-home.dart

class MyHomePage extends StatelessWidget {
  Future<bool> _loginUser() async {
    final api = await FBApi.signInWithGoogle();
    if (api != null) {
      return true;
    } else {
      return false;
    }
  }
  ...

3 个答案:

答案 0 :(得分:1)

这个周末,我遇到了类似的问题,并通过退出GoogleSignIn来解决了这一问题-但是我不确定这是否是正确的方法,因为我希望FirbaseAuth能够自动退出所有提供商。

static Future<void> signOut() async {
  await _auth.signOut().then((_) {

  //try the following
  _googleSignIn.signOut();
  //try the following

  Navigator.of(context).pushNamedAndRemoveUntil("/login", ModalRoute.withName("/home"));
});

答案 1 :(得分:0)

如果您对Google SignIn的登录弹出窗口有疑问,请在退出通话后执行此操作

 Navigator.pushReplacement(
        (context), MaterialPageRoute(builder: (context) => widget));

答案 2 :(得分:0)

用户从Firebase注销,但未从Google注销。
因此,下次您已经有一个用户登录,并且由GoogleSignIn()返回。
您还需要从Google注销。以下内容非常适合我:

Future signOut() async {
    try {
      await _fireBaseAuthInstance.signOut();
      await _googleSignInInstance.signOut();
    } catch (e) {
      print('Failed to signOut' + e.toString());
    }
}