首页 > 解决方案 > 如何在颤振应用程序中使用计时器来更改数据?

问题描述

当用户使用 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();,但这也没有解决问题。

标签: firebasedartflutterfirebase-authentication

解决方案


你走错路了。正确的方法是在 401 (Unauthorized) 错误上添加错误处理程序,并通过刷新令牌并重试相同的查询来处理它。


推荐阅读