You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter实现SharedPreferences数据超时自动删除(跨会话续计时)

解决Flutter中SharedPreferences数据超时重启后续计时的问题

核心问题是你没记录数据存储的时间点,每次重启都直接开启5分钟新计时器。要实现续计时,必须把数据存储的时间戳也存在SharedPreferences里,重启时通过时间差计算剩余时长。

具体实现步骤:

  1. 存储数据时同步记录时间戳
    保存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);
    }
    
  2. 初始化时计算剩余时间并设置对应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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 05:35:11