firebase - 使用 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
}
}
解决方案
我有同样的问题。我能够登录,但在重新启动应用程序时,我得到了另一个随机 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);
}
我希望它能帮助你们中的一些人,避免像我一样在愚蠢的错误上浪费时间!
推荐阅读
- css - 字段集和图例上的显示网格在 FireFox 和 Chrome 上表现异常?
- mongodb - 添加到 MongoDB 中的双嵌套数组
- reactjs - 当组件由于 Props 更改而重新渲染时,是否应该使用 State?
- mysql - mysql 用于摄取 sql 文件的小于符号的名称是什么?
- javascript - 无法使用 ScrollMagic 固定
- javascript - 为什么我的数据 obj 的更改没有反映在 vue.js 模板中?
- python - 键错误:'val_acc'
- python - 将输入存储到python中的字符串列表中
- c++ - 猜测模板中矩阵的类型
- c - 哈希函数在同一个地方发送关闭键