如何设置Flutter按钮:首次点击显示插页广告,二次点击执行其他操作
Flutter按钮插页广告优先触发及点击逻辑优化
核心思路
- 添加状态变量追踪按钮点击状态,区分首次与非首次点击
- 让插页广告支持关闭回调,确保广告操作完成后再执行后续逻辑
- 重构按钮点击事件,分场景处理广告展示与业务操作
修改后的完整代码
首先在你的State类中添加状态变量:
bool _isFirstClick = true;
然后修改插页广告方法,增加关闭回调(以AdMob为例,可替换为你使用的广告SDK逻辑):
void _showInterstitialAd({VoidCallback? onAdClosed}) { InterstitialAd.load( adUnitId: '你的广告单元ID', request: const AdRequest(), adLoadCallback: InterstitialAdLoadCallback( onAdLoaded: (ad) { ad.fullScreenContentCallback = FullScreenContentCallback( onAdDismissedFullScreenContent: (ad) { ad.dispose(); // 广告关闭后触发后续逻辑 onAdClosed?.call(); }, onAdFailedToShowFullScreenContent: (ad, err) { ad.dispose(); // 广告显示失败也执行回调,避免用户操作卡住 onAdClosed?.call(); }, ); ad.show(); }, onAdFailedToLoad: (err) { // 广告加载失败同样触发回调 onAdClosed?.call(); }, ), ); }
最后重构弹窗按钮的点击逻辑:
void showPopUpButton(BuildContext context) { showDialog( context: context, builder: (context) => Dialog( backgroundColor: Colors.transparent, child: IconButton( icon: Image.asset('lib/images/last.png'), iconSize: 260, onPressed: () async { if (_isFirstClick) { // 首次点击:仅展示插页广告,关闭后返回菜单并更新状态 _showInterstitialAd(onAdClosed: () { Navigator.pop(context); setState(() { _isFirstClick = false; }); }); } else { // 非首次点击:执行原有业务操作 setState(() {}); initRandomImage(); Navigator.pop(context); final player = AudioPlayer(); await player.play(AssetSource('Sound1.wav'), volume: 1.0); } }, ), ), ).then((_) { // 弹窗关闭后重置点击状态,下次打开弹窗仍保持首次点击逻辑 setState(() { _isFirstClick = true; }); }); }
关键说明
- 广告优先触发:首次点击时仅执行广告展示逻辑,原有业务操作完全延后到广告关闭后(或非首次点击)
- 状态重置:通过
showDialog的then方法,在弹窗关闭后重置点击状态,保证每次打开弹窗的首次点击都触发广告 - 异常处理:广告加载/展示失败时仍执行回调,避免用户点击后无响应
内容的提问来源于stack exchange,提问作者TYS86
相关产品推荐
相关产品推荐

