横幅

横幅广告会占据应用布局中的一处位置,要么是设备屏幕的顶部,要么是底部。用户与应用互动时,这类广告会停留在屏幕上,并且可在一段时间后自动刷新。

本指南介绍了如何将 AdMob 横幅广告植入到 Flutter 应用中。除了代码段和说明之外,本指南还介绍了如何将横幅广告调整至合适的尺寸。

始终使用测试广告进行测试

在构建和测试应用时,请确保使用的是测试广告,而不是实际投放的广告。否则,可能会导致您的账号被暂停。

对于横幅广告,加载测试广告最简便的方法就是使用我们的专用测试广告单元 ID:

Android

ca-app-pub-3940256099942544/6300978111

iOS

ca-app-pub-3940256099942544/2934735716

测试广告单元配置为为每个请求返回测试广告,您可以在自己应用的编码、测试和调试过程中随意使用这些测试广告单元。只需确保在发布应用前用您自己的广告单元 ID 替换这些测试广告单元 ID 即可。

加载广告

以下示例实例化了一个横幅广告:

class BannerExampleState extends State<BannerExample> {
  BannerAd? _bannerAd;
  bool _isLoaded = false;

  // TODO: replace this test ad unit with your own ad unit.
  final adUnitId = Platform.isAndroid
    ? 'ca-app-pub-3940256099942544/6300978111'
    : 'ca-app-pub-3940256099942544/2934735716';

  /// Loads a banner ad.
  void loadAd() {
    _bannerAd = BannerAd(
      adUnitId: adUnitId,
      request: const AdRequest(),
      size: AdSize.banner,
      listener: BannerAdListener(
        // Called when an ad is successfully received.
        onAdLoaded: (ad) {
          debugPrint('$ad loaded.');
          setState(() {
            _isLoaded = true;
          });
        },
        // Called when an ad request failed.
        onAdFailedToLoad: (ad, err) {
          debugPrint('BannerAd failed to load: $error');
          // Dispose the ad here to free resources.
          ad.dispose();
        },
      ),
    )..load();
  }
}

下表列出了标准的横幅广告尺寸。

尺寸(宽 x 高,以 dp 为单位) 说明 AdSize 常量
320x50 标准横幅广告 banner
320x100 大型横幅广告 largeBanner
320x250 中矩形 mediumRectangle
468x60 全尺寸横幅广告 fullBanner
728x90 排行榜 leaderboard
提供的宽度 x 自适应高度 自适应横幅广告 不适用

如需指定横幅广告尺寸,请设置首选的 AdSize

final AdSize adSize = AdSize(300, 50);

通过使用 BannerAdListener,您可以监听各种生命周期事件,例如广告何时加载。以下示例实现了每个方法,并将消息记录到控制台:

class BannerExampleState extends State<BannerExample> {
  BannerAd? _bannerAd;
  bool _isLoaded = false;

  // TODO: replace this test ad unit with your own ad unit.
  final adUnitId = Platform.isAndroid
    ? 'ca-app-pub-3940256099942544/6300978111'
    : 'ca-app-pub-3940256099942544/2934735716';


  /// Loads a banner ad.
  void loadAd() {
    _bannerAd = BannerAd(
      adUnitId: adUnitId,
      request: const AdRequest(),
      size: AdSize.banner,
      listener: BannerAdListener(
        // Called when an ad is successfully received.
        onAdLoaded: (ad) {
          debugPrint('$ad loaded.');
          setState(() {
            _isLoaded = true;
          });
        },
        // Called when an ad request failed.
        onAdFailedToLoad: (ad, err) {
          debugPrint('BannerAd failed to load: $error');
          // Dispose the ad here to free resources.
          ad.dispose();
        },
        // Called when an ad opens an overlay that covers the screen.
        onAdOpened: (Ad ad) {},
        // Called when an ad removes an overlay that covers the screen.
        onAdClosed: (Ad ad) {},
        // Called when an impression occurs on the ad.
        onAdImpression: (Ad ad) {},
      ),
    )..load();
  }
}

展示横幅广告

如需以微件形式展示 BannerAd,您必须在调用 load() 之后实例化含有受支持广告的 AdWidget。您可以在调用 load() 之前创建微件,但必须先调用 load(),然后才能将该微件添加到微件树中。

AdWidget 继承自 Flutter 的 Widget 类,可以像其他任何微件一样使用。在 iOS 中,请确保将该微件放置在具有指定宽度和高度的微件中。否则,您的广告可能不会展示。BannerAd 可以放置在尺寸与该广告匹配的容器中:

...
if (_bannerAd != null) {
  Align(
    alignment: Alignment.bottomCenter,
    child: SafeArea(
      child: SizedBox(
        width: _bannerAd!.size.width.toDouble(),
        height: _bannerAd!.size.height.toDouble(),
        child: AdWidget(ad: _bannerAd!),
      ),
    ),
  )
}
...

当不再需要访问广告时,必须予以处置。调用 dispose() 的最佳实践是在 AdWidget 从 widget 树中移除后或在 BannerAdListener.onAdFailedToLoad() 回调中调用。

大功告成!您的应用现在就可以展示横幅广告了。

Android 9 及更低版本上的滚动限制

我们知道,在滚动视图中展示内嵌横幅广告时,搭载 Android 9 或更低版本的某些旧款或性能较弱的设备可能会出现效果不佳的情况。我们建议仅在 Android 10 或更高版本上使用这些类型的横幅广告。固定位置横幅广告(如锚定横幅广告)不会受到影响,可在所有 Android API 级别上使用,取得最佳性能。

GitHub 上的完整示例

横幅广告