Firebase 如何在颤振应用程序中使用计时器更改数据?

Firebase 如何在颤振应用程序中使用计时器更改数据?,firebase,dart,flutter,firebase-authentication,Firebase,Dart,Flutter,Firebase Authentication,当用户使用firebase身份验证登录时,我使用共享首选项存储令牌、电子邮件、用户名和其他用户详细信息。firebase令牌每一小时过期一次,因此我需要根据用户何时返回我在下面的getCurrentUser()函数中正在执行的应用程序来刷新令牌。我想知道,如果一个用户登录了我的应用程序,使用了5分钟左右,然后关闭了应用程序,那么定时器功能是否仍在监听并在超时后调用该功能? 如果它不这样做,那么我如何实现检查这一点 void checkTokenValidity(int time) { Timer

当用户使用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;
}
}
void checkTokenValidity(整数时间){
计时器(持续时间(秒:时间),()异步{
打印(“令牌超时”);
SharedReferences prefs=等待SharedReferences.getInstance();
prefs.setString('token','expired');
优先删除(“当前用户”);
});
}
未来getCurrentUser()异步{
final SharedReferences prefs=等待SharedReferences.getInstance();
最终字符串currentToken=prefs.getString('token');
最终字符串cuser=prefs.getString('currentUser');
打印(“当前:$cuser”);
如果(cuser!=null&¤tToken!='expired'){
打印(“已登录和$currentToken”);
SharedReferences prefs=等待SharedReferences.getInstance();
String token=prefs.getString('token');
stringuid=prefs.getString('userId');
String email=prefs.getString('userEmail');
String photo=prefs.getString('photo');
_认证用户=
用户(电子邮件:电子邮件,id:uid,令牌:令牌,照片:照片);
回归"成功",;
}否则如果(currentToken=='expired'){
打印(“令牌已过期”);
final FirebaseUser user=等待FirebaseAuth.instance.signinanoymously();
var token=await user.getIdToken();
首选设置字符串(“令牌”,令牌);
stringuid=prefs.getString('userId');
String email=prefs.getString('userEmail');
String photo=prefs.getString('photo');
_认证用户=
用户(id:uid,email:email,token:token,photo:photo);
有效性检查(3600);
返回“令牌”;
}否则{
打印('用户为空');
返回null;
}
}
在不在这里的身份验证函数中,我在用户成功登录后调用了
checkTokenValidity(3600)


我还尝试使用
FirebaseUser=await FirebaseAuth.instance.currentUser()但这也不能解决问题。

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

为什么要存储这些详细信息?Firebase身份验证客户端已经在应用程序重新启动之间保持用户的身份验证状态,因此您可以在需要时使用
wait FirebaseAuth.instance.currentUser()
查找。这是正确的,但实际上这不是一个问题,它不起作用,主要问题是,即使在关闭应用程序后,计时器功能是否仍在侦听?如果您的问题是有关Firebase身份验证的,您可能希望从问题中删除这些部分。这使得更有可能有人能够/将提供帮助。请参阅。Firebase身份验证会自动刷新引擎盖下的令牌。你不需要为此做任何事。很好,去听哈希特。如果您将您的解决方案作为答案发布,其他人将来可能会从中受益。