firebase - 如何在颤振应用程序中使用计时器来更改数据?
问题描述
当用户使用 Firebase 身份验证登录时,我使用共享首选项来存储令牌、电子邮件、用户名和其他用户详细信息。firebase 令牌每隔一小时到期一次,因此我需要根据用户何时返回到我在getCurrentUser()
下面的函数中执行的应用程序来刷新令牌。我想知道,如果用户登录了我的应用程序,使用了 5 分钟左右然后关闭应用程序,该计时器功能是否仍会在超时后监听并调用该功能?如果它不这样做,那么我该如何检查呢?
void checkTokenValidity(int time) {
Timer(Duration(seconds: time), () async {
print('token timed out');
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('token', 'expired');
prefs.remove("currentUser");
});
}
Future<String> getCurrentUser() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
final String currentToken = prefs.getString('token');
final String cuser = prefs.getString('currentUser');
print("current: $cuser");
if (cuser != null && currentToken != 'expired') {
print('signed in and $currentToken');
SharedPreferences prefs = await SharedPreferences.getInstance();
String token = prefs.getString('token');
String uid = prefs.getString('userId');
String email = prefs.getString('userEmail');
String photo = prefs.getString('photo');
_authenticatedUser =
User(email: email, id: uid, token: token, photo: photo);
return 'success';
} else if (currentToken == 'expired') {
print('token is expired');
final FirebaseUser user = await FirebaseAuth.instance.signInAnonymously();
var token = await user.getIdToken();
prefs.setString('token', token);
String uid = prefs.getString('userId');
String email = prefs.getString('userEmail');
String photo = prefs.getString('photo');
_authenticatedUser =
User(id: uid, email: email, token: token, photo: photo);
checkTokenValidity(3600);
return 'token';
} else {
print('user is null');
return null;
}
}
在我不在这里的身份验证功能中,我checkTokenValidity(3600)
在用户成功登录后立即调用。
我也尝试过使用FirebaseUser user = await FirebaseAuth.instance.currentUser();
,但这也没有解决问题。
解决方案
你走错路了。正确的方法是在 401 (Unauthorized) 错误上添加错误处理程序,并通过刷新令牌并重试相同的查询来处理它。
推荐阅读
- oracle - 如何解决 Oracle SQL 中的错误 12505?
- android - 在底部导航的片段之间切换时片段重置
- vue.js - VueJS:即使我希望它在每次重新渲染时都覆盖它的值,直接改变一个道具真的很糟糕吗?
- java - 线程“主”java.util.NoSuchElementException codechef 中的异常
- java - 为什么java双重检查锁单例必须使用volatile关键字?
- python - 如何将一串字符串转换为列表?
- python - 如何在Python中提取包含特定字符的字符串
- layout - 在 ScrollView 中使用 GeometryReader 的 SwiftUI 布局
- excel - 用于删除零的替代 Excel 过滤器公式
- ios - Swift Realm - “'Results' 类型的值没有成员”