如何在flutter app中使用计时器来更改数据?

问题描述 投票:0回答:1

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

firebase dart flutter firebase-authentication
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.