首页 > 解决方案 > 使用 Firebase currentUser 持续登录不工作 - Flutter 应用程序

问题描述

我对这个应用程序的目标是持久登录,这样我的 Flutter 应用程序的用户只需要登录一次(除非他们退出)并且每当我的 Flutter 应用程序重新启动时,他们都不需要重新登录。我看到许多使用 Firebase 身份验证和 .currentUser() 方法的示例,但每次重新启动应用程序时我仍然必须登录。我在模拟器(ios)和我的物理iphone上测试了这个,同时在xCode(usb连接)上运行调试模式。我是否有可能无法以这种方式测试此功能?因为我确实在 android studio 和 xCode 终端上都看到了一条消息,其中提到了与设备的连接丢失或由于重新启动而停止运行。如果是这种情况,我如何测试持久登录是否有效?

如果不是这样,我做错了什么?我已经包含了下面的代码。当然,这是在有状态小部件中发生的。

final _auth = FirebaseAuth.instance;

checkIfCurrentUserExists() async {
  try {
    await _auth.currentUser().then((user) {
      print('this is the user $user');
      if (user != null && user.email != null) {
        userIsLoggedIn = true;
        // this works fine!
      }
    });
  } catch (e) {
   print('current user was not found $e');
   // this works fine!
  }
}

// called inside initState() 
setClientOnLoad() async {
  await Spryte.checkIfCurrentUserExists();
  var doesCurrentUserExist = userIsLoggedIn;
  var currentUser = await returnCurrentUser();
  if (doesCurrentUserExist == false) {
    //if user is not authenticated, set anonymous user
    // this works fine!
  } 
  else {
    //print('current user does exist');
    await foo(currentUser.uid);
    // 'foo' is meant to retrieve some data about the client on loading of the app
    // so that the user doesn't have to log in every time the app restarts
    // but for some reason it's not working for me
  }
}

标签: firebaseflutterfirebase-authentication

解决方案


我有同样的问题。我能够登录,但在重新启动应用程序时,我得到了另一个随机 UID。

这听起来可能很愚蠢,但请确保您signInAnonymously();在应用程序中的任何时候都不会在不检查当前用户是否已经存在的情况下进行调用。

这是我的问题,每次应用重启时我总是匿名登录。

这是我从我的起始应用程序页面所做的(负责设置包括用户在内的应用程序):

Future<FirebaseUser> signInAnonymously() async {
    AuthResult result = await _auth.signInAnonymously();
    final FirebaseUser user = result.user;

    assert(user != null);
    assert(await user.getIdToken() != null);

    return user;
  }

这是检查方法:

Future<FirebaseUser> tryToFetchUser() async {
    var user = await _auth.currentUser();
    if (user == null) {
      user = await FirebaseAuth.instance.onAuthStateChanged.first;
    }
    if (user == null) {
      user = await signInAnonymously();
    }
    return Future.value(user);
  }

我希望它能帮助你们中的一些人,避免像我一样在愚蠢的错误上浪费时间!


推荐阅读