如何在Flutter应用中使用计时器更改数据?

时间:2019-04-22 14:01:13

标签: firebase dart flutter firebase-authentication

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

1 个答案:

答案 0 :(得分:0)

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