Flutter中从showModalBottomSheet展示AdMob插屏广告报错求助
Flutter AdMob插屏广告在showModalBottomSheet中展示失败的解决办法
报错原因
错误码17的本质是:AdMob插屏广告需要绑定到当前处于最顶层、活跃展示状态的原生视图控制器(ViewController),而showModalBottomSheet内部组件的上下文对应的是弹窗的视图控制器,并非应用当前最顶层的页面视图控制器,因此广告无法正确挂载展示。
解决方案
方法1:使用根导航上下文展示广告
通过Navigator.of(context, rootNavigator: true)获取应用最顶层的导航上下文,让广告绑定到正确的视图控制器:
void displayAd() async { if (interstitialAd != null) { interstitialAd!.fullScreenContentCallback = FullScreenContentCallback( onAdDismissedFullScreenContent: (ad) { // 广告关闭后释放实例,避免内存泄漏 ad.dispose(); interstitialAd = null; }, onAdFailedToShowFullScreenContent: (ad, adError) { print(adError); ad.dispose(); interstitialAd = null; }, ); // 获取根导航上下文 final rootContext = Navigator.of(context, rootNavigator: true); await interstitialAd!.show(context: rootContext); } }
方法2:先关闭弹窗再展示广告
如果业务逻辑允许,可先关闭底部弹窗,再展示广告,此时广告会使用页面的正常上下文:
void displayAd() async { if (interstitialAd != null) { // 关闭当前底部弹窗 Navigator.pop(context); interstitialAd!.fullScreenContentCallback = FullScreenContentCallback( onAdDismissedFullScreenContent: (ad) { ad.dispose(); interstitialAd = null; // 可选:广告关闭后重新打开弹窗 // showModalBottomSheet(context: context, builder: (_) => AudioConverter()); }, onAdFailedToShowFullScreenContent: (ad, adError) { print(adError); ad.dispose(); interstitialAd = null; }, ); await interstitialAd!.show(); } }
注意事项
- 确保插屏广告已完成预加载,避免在未就绪状态调用
show() - 广告展示完成或失败后,务必在回调中调用
ad.dispose()并置空广告实例,防止内存泄漏
内容的提问来源于stack exchange,提问作者shakti goyal
相关产品推荐
相关产品推荐

