如何在Flutter中实现每日自动从API更新HiveBox缓存数据
实现Hive缓存每日自动更新的方案
要解决远程数据更新但本地缓存未同步的问题,核心思路是记录缓存的更新时间,每次App启动时判断缓存是否超过24小时,过期则重新拉取远程数据更新缓存。具体实现步骤如下:
1. 存储缓存更新时间
每次调用_save()保存远程数据时,同时把当前时间戳存入Hive,用于后续判断缓存有效期。
2. 检查缓存有效期
App启动时,先判断缓存是否存在:
- 若缓存为空,直接拉取远程数据并保存;
- 若缓存存在,取出缓存更新时间,和当前时间对比,若间隔超过24小时(86400秒),则重新拉取数据更新缓存;否则直接使用本地缓存。
3. 修改后的代码示例
await Hive.initFlutter(); var box = await Hive.openBox('wiseBox'); // 获取缓存数据和更新时间 final cachedData = box.get('data'); final lastUpdateTime = box.get('lastUpdateTime'); if (cachedData == null || lastUpdateTime == null) { // 首次启动或缓存为空,拉取数据并保存 await _save(); } else { // 计算当前时间与上次更新的间隔(秒) final currentTime = DateTime.now().millisecondsSinceEpoch; final timeDiff = (currentTime - lastUpdateTime) ~/ 1000; if (timeDiff >= 86400) { // 超过24小时(86400秒) // 缓存过期,重新拉取数据更新 await _save(); } else { // 缓存有效,使用本地数据 _openCashedData(); } } _save() async { // 替换为实际拉取Airtable API数据的逻辑 final remoteData = await fetchDataFromAirtable(); // 保存数据和当前时间戳 await box.put('data', remoteData); await box.put('lastUpdateTime', DateTime.now().millisecondsSinceEpoch); } _openCashedData() { return box.get('data'); }
额外说明
- 如果需要App在后台也能自动更新缓存,可以使用
workmanager插件实现定时任务,每日固定时间触发数据拉取和缓存更新; - 拉取远程数据时要处理网络异常,若请求失败,可保留旧缓存并提示用户,避免App无数据可用。
内容的提问来源于stack exchange,提问作者SaturnPro
相关产品推荐
相关产品推荐

