Flutter如何处理时间触发事件?看完激励视频后如何3天内隐藏对应广告组件?
需求可行性确认
该需求完全可以实现,核心逻辑是持久化存储用户完成激励视频观看的时间,每次加载对应组件时校验时间差是否超过3天即可。
核心实现思路
- 选择合适的本地持久化存储方案,轻量场景优先使用
shared_preferences,无需复杂配置即可实现键值对数据的持久化存储,应用卸载后数据才会清除。 - 监听激励视频的播放完成回调,用户成功看完视频后,将当前时间的毫秒级时间戳(或直接计算3天后的时间戳)写入本地存储。
- 每次需要渲染广告组件前,先读取本地存储的时间戳做校验:
- 若本地无存储记录、或当前时间减去存储的观看时间戳大于3天对应的毫秒数(
3*24*60*60*1000),说明有效期已过,正常展示广告组件 - 若时间差小于3天,直接隐藏广告组件即可
- 若本地无存储记录、或当前时间减去存储的观看时间戳大于3天对应的毫秒数(
- 如果对防作弊有要求,建议搭配服务端返回的时间戳做存储和校验,避免用户修改本地系统时间绕过限制
代码实现参考
首先在pubspec.yaml中引入依赖:
dependencies: flutter: sdk: flutter shared_preferences: ^2.2.2 # 可替换为最新稳定版
核心逻辑代码示例:
import 'package:shared_preferences/shared_preferences.dart'; /// 判断当前是否需要展示广告组件 Future<bool> shouldShowRewardAd() async { final SharedPreferences prefs = await SharedPreferences.getInstance(); // 读取存储的3天禁用到期时间戳,无记录时默认返回0 final int adDisableEndTime = prefs.getInt('reward_ad_disable_end') ?? 0; // 获取当前时间戳(如果用服务端时间替换此处即可) final int currentTime = DateTime.now().millisecondsSinceEpoch; // 当前时间超过禁用到期时间就需要展示广告 return currentTime > adDisableEndTime; } /// 看完激励视频后调用,设置广告3天不展示 Future<void> disableRewardAdFor3Days() async { final SharedPreferences prefs = await SharedPreferences.getInstance(); // 计算3天后的到期时间戳 final int disableEndTime = DateTime.now().millisecondsSinceEpoch + 3 * 24 * 60 * 60 * 1000; await prefs.setInt('reward_ad_disable_end', disableEndTime); }
在组件中使用时可以搭配FutureBuilder做异步判断,控制组件是否渲染即可。
内容的提问来源于stack exchange,提问作者user3697484
相关产品推荐
相关产品推荐

