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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:11:00