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

Flutter实现调研弹窗仅显示一次,重启App不再弹出的方案求助

调研弹窗仅显示一次(含App重启)的解决方案

核心问题

你当前的判断逻辑依赖内存中的videoTrigger变量,App重启后内存数据会被清空,所以弹窗会再次触发。要实现重启后不再显示,必须用持久化存储记录用户是否已经完成过调研(或者是否已经展示过弹窗)。

实现步骤&代码修改

  1. 先引入持久化存储工具,比如Flutter官方的shared_preferences(如果项目里没用到,先在pubspec.yaml添加依赖)。
  2. 在用户完成调研的时机,把状态写入本地存储;触发弹窗前,先读取本地存储的状态判断是否要显示。

修改后的showGenexPopup方法示例:

void showGenexPopup() {
  WidgetsBinding.instance.addPostFrameCallback((_) async {
    // 初始化SharedPreferences
    final prefs = await SharedPreferences.getInstance();
    // 读取本地存储的标记:默认是false(未完成)
    final hasFinishedSurvey = prefs.getBool('has_finished_survey') ?? false;
    
    final GenexViewModel genexViewModel =
        Provider.of<GenexViewModel>(context, listen: false);

    // 同时满足:videoTrigger为false + 用户未完成过调研,才显示弹窗
    if (!genexViewModel.videoTrigger && !hasFinishedSurvey) {
      genexViewModel.showSurvey(
        context: context,
        pageId: GenexPageId.SearchPage,
        duration: const Duration(seconds: 5),
        // 假设showSurvey提供调研完成的回调,在这里写入标记
        onComplete: () async {
          await prefs.setBool('has_finished_survey', true);
        },
      );
    }
  });
}

如果你的showSurvey方法没有内置完成回调,就找到用户实际完成调研的时机(比如弹窗关闭、提交成功的回调函数),在那个时机执行prefs.setBool('has_finished_survey', true)即可。

WebView环境的影响

从代码看你是在Flutter侧实现的弹窗,哪怕是在WebView所在页面调用,这个方案完全可行——因为SharedPreferences是App全局的本地存储,和WebView页面刷新无关。如果是WebView里的H5弹窗才需要用H5的localStorage,但你的场景不涉及这个,所以不用担心。

额外优化点

  • 如果只希望弹窗展示一次(不管用户是否完成),可以把标记改成has_shown_survey,在弹窗显示后就写入本地存储。
  • 如果需要在App版本更新后重新触发弹窗,可以把版本号和标记绑定,比如存储survey_shown_version,每次启动对比当前App版本,版本不一致就重置标记。

内容的提问来源于stack exchange,提问作者SaDev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:13:21