Flutter实现SharedPreferences数据超时自动删除(跨会话续计时)
核心问题是你没记录数据存储的时间点,每次重启都直接开启5分钟新计时器。要实现续计时,必须把数据存储的时间戳也存在SharedPreferences里,重启时通过时间差计算剩余时长。
具体实现步骤:
存储数据时同步记录时间戳
保存myData的同时,把当前时间的毫秒数存为时间戳,确保后续能计算已流逝时长:Future<void> saveData(String data) async { final SharedPreferences prefs = await SharedPreferences.getInstance(); await prefs.setString('myData', data); // 存储当前时间的毫秒时间戳 await prefs.setInt('saveTimestamp', DateTime.now().millisecondsSinceEpoch); }初始化时计算剩余时间并设置对应Timer
修改initializePreferences方法,先读取时间戳、计算剩余时长,再决定Timer的时长或直接执行超时逻辑:Future<void> initializePreferences() async { final SharedPreferences prefs = await SharedPreferences.getInstance(); _data = prefs.getString('myData'); final int? saveTimestamp = prefs.getInt('saveTimestamp'); if (_data != null && saveTimestamp != null) { // 计算从存储数据到现在已过去的毫秒数 final int elapsedTime = DateTime.now().millisecondsSinceEpoch - saveTimestamp; // 总超时时长:5分钟 = 300000毫秒 const int totalTimeout = 5 * 60 * 1000; // 计算剩余的有效时长 final int remainingTime = totalTimeout - elapsedTime; if (remainingTime > 0) { // 剩余时间大于0,设置对应时长的Timer Timer(Duration(milliseconds: remainingTime), () { _clearDataAndNavigate(prefs); }); } else { // 已超时,直接清除数据并跳转登录页 _clearDataAndNavigate(prefs); } } else { // 无有效数据,直接跳转登录页 Navigator.pushNamedAndRemoveUntil(context, '/', (route) => false); } } // 提取公共方法,避免重复代码 void _clearDataAndNavigate(SharedPreferences prefs) async { await prefs.remove('myData'); await prefs.remove('saveTimestamp'); // 同步删除时间戳,避免无效数据残留 setState(() { _data = null; }); Navigator.pushNamedAndRemoveUntil(context, '/', (route) => false); print("Data is removed."); }
关键细节说明:
- 用
millisecondsSinceEpoch获取时间戳,计算精准且不受时区影响; - 清除数据时要同步删除
saveTimestamp,避免下次启动读取到无效的时间戳; - 如果剩余时长<=0,直接触发超时逻辑,确保数据不会超期留存。
修改后,用户关闭应用再打开时,Timer会根据之前存储的时间戳计算剩余时长,从剩余时间继续倒计时,而非重新开始5分钟计时。
内容的提问来源于stack exchange,提问作者Md. Samiul Islam
相关产品推荐
相关产品推荐

