Flutter广告管理插件google_mobile_ads_manager的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter广告管理插件google_mobile_ads_manager的使用

功能特性

google_mobile_ads_manager 插件提供了与 AdMob SDK 交互的简单、简洁且完全管理的方式。以下是该插件的主要功能:

  • 🚀 自动高效的广告预加载和队列管理
  • 💪 智能请求重试机制(失败时自动重试)
  • 🛡 错误处理
  • ⚙️ 广告展示后自动销毁
  • ⚡ 可选的概率性广告展示,以提升用户体验
  • ❤️ 简洁直观的 API,按广告类型分离
  • 🔋 内置电池(即开箱即用的功能)

初始化策略

广告可以通过两种方式初始化:

  1. 在初始化 AdMob SDK 时:通过在启动时提供一个 Initializer 对象列表。
  2. 在任何时间:通过向 MobileAdsManager.instance 提供相关类型的 Initializer 对象。

所有类型的广告都有自动重试机制,除了 App Open 广告。App Open 广告不会重试,因为重试加载可能会导致过长的等待时间,影响用户体验。

MobileAdsManager

MobileAdsManager 是管理所有广告的核心类,可以通过静态实例获取器 MobileAdsManager.instance 访问。在使用其他方法之前,必须调用 initializeSDK 方法来初始化 SDK。

// 获取实例
final adManager = MobileAdsManager.instance;  

// 使用默认配置初始化 SDK
MobileAdsManager.instance.initializeSDK();

也可以通过自定义配置来初始化 MobileAdsManager

MobileAdsManager.instance.initializeSDK(  
  loadingStrategy: LoadingStrategy.fastLoading,  
  appOpenAd: AppOpenAdInitializer(adUnitId: '<Ad Unit ID>'),  
  interstitialAds: <InterstitialAdInitializer>[  
    InterstitialAdInitializer(adUnitId: '<Ad Unit ID 1>', count: 3),  
    InterstitialAdInitializer(adUnitId: '<Ad Unit ID 2>', count: 3),  
  ],  
  rewardedAds: <RewardedAdInitializer>[  
    RewardedAdInitializer(adUnitId: '<Ad Unit ID 3>', count: 2),  
    RewardedAdInitializer(adUnitId: '<Ad Unit ID 4>', count: 2),  
  ],  
  bannerAds: <BannerAdInitializer>[  
    BannerAdInitializer(  
      adUnitId: '<Ad Unit ID 5>',  
      bannerAdSize: AdSize.banner,  
    ),  
    BannerAdInitializer(  
      adUnitId: '<Ad Unit ID 6>',  
      bannerAdSize: AdSize.banner,  
    ),  
  ],  
  onSDKInitializationError: (Object? error, StackTrace stackTrace) {  
    // 处理与初始化 AdMob SDK 相关的错误  
  },  
  onAdsInitializationError: (Object? error, StackTrace stackTrace) {  
    // 处理与初始化任何广告相关的错误  
  },  
);

App Open 广告

App Open 广告通过 ManagedAppOpenAd 实例进行管理,该实例负责初始化、加载广告并在显示后销毁。

// 初始化 App Open 广告
MobileAdsManager.instance.initializeSDK(  
  appOpenAd: AppOpenAdInitializer(adUnitId: '<Ad Unit ID>'),  
);

// 获取并显示 App Open 广告
ManagedAppOpenAd ad = MobileAdsManager.instance.getManagedAppOpenAd()!;
ad.showAppOpenAd();

可以基于概率显示 App Open 广告:

// 70% 的概率加载 App Open 广告
MobileAdsManager.instance.initializeSDK(  
  appOpenAd: AppOpenAdInitializer(  
    adUnitId: '<Ad Unit ID>',  
    loadChance: 0.7,  
  ),  
);

// 获取并显示 App Open 广告(可能为 null)
ManagedAppOpenAd? ad = MobileAdsManager.instance.getManagedAppOpenAd();  
ad?.showAppOpenAd();

插入式广告(Interstitial Ads)

插入式广告通过 ManagedInterstitialAdQueue 实例进行管理,该实例包含多个 InterstitialAd,并在广告显示后自动销毁并加载新的广告。

// 初始化两个插入式广告队列
MobileAdsManager.instance.initializeSDK(  
  interstitialAds: <InterstitialAdInitializer>[  
    InterstitialAdInitializer(adUnitId: '<Ad Unit ID 1>', count: 3),  
    InterstitialAdInitializer(adUnitId: '<Ad Unit ID 2>', count: 3),  
  ],  
);

// 获取并显示插入式广告
ManagedInterstitialAdQueue? queue2 =  
    MobileAdsManager.instance.getManagedInterstitialAdQueue(  
  adUnitId: '<Ad Unit ID 2>',  
);  
  
queue2?.showInterstitialAd(showChance: 0.65);

奖励广告(Rewarded Ads)

奖励广告通过 ManagedRewardedAdQueue 实例进行管理,该实例包含多个 RewardedAd,并在广告显示后自动销毁并加载新的广告。

// 初始化两个奖励广告队列
MobileAdsManager.instance.initializeSDK(  
  rewardedAds: <RewardedAdInitializer>[  
    RewardedAdInitializer(adUnitId: '<Ad Unit ID 1>', count: 2),  
    RewardedAdInitializer(adUnitId: '<Ad Unit ID 2>', count: 2),  
  ],  
);

// 获取并显示奖励广告
ManagedRewardedAdQueue? queue2 =  
    MobileAdsManager.instance.getManagedRewardedAdQueue(  
  adUnitId: '<Ad Unit ID 2>',  
);  
  
queue2?.showRewardedAd(  
  showChance: 0.65,  
  onUserEarnedReward: (AdWithoutView ad, RewardItem reward) {  
    // 给用户发放奖励  
  },  
);

横幅广告(Banner Ads)

横幅广告通过 ManagedBannerAd 实例进行管理,该实例负责初始化、加载广告并在加载失败时销毁。

// 初始化两个横幅广告
MobileAdsManager.instance.initializeSDK(  
  bannerAds: <BannerAdInitializer>[  
    BannerAdInitializer(  
      adUnitId: '<Ad Unit ID 1>',  
      bannerAdSize: AdSize.banner,  
    ),  
    BannerAdInitializer(  
      adUnitId: '<Ad Unit ID 2>',  
      bannerAdSize: AdSize.banner,  
    ),  
  ],  
);

// 获取并显示横幅广告
ManagedBannerAd? ad2 = MobileAdsManager.instance.getManagedBannerAd(  
  adUnitId: '<Ad Unit ID 2>',  
);  
  
Widget adWidget = AdWidget(ad: ad2!.getAd());

// 在 Widget 树中移除 AdWidget 时调用 dispose
[@override](/user/override)  
void dispose() {  
  ad2.dispose();  
  super.dispose();  
}

完整示例 Demo

以下是一个完整的示例应用程序,展示了如何使用 google_mobile_ads_manager 插件来管理不同类型的广告。

import 'package:flutter/material.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';
import 'package:google_mobile_ads_manager/google_mobile_ads_manager.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('广告管理示例')),
      body: Column(
        children: [
          ElevatedButton(
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => AppOpenExample()),
              );
            },
            child: Text('App Open 广告'),
          ),
          ElevatedButton(
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => InterstitialExample()),
              );
            },
            child: Text('插入式广告'),
          ),
          ElevatedButton(
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => RewardedExample()),
              );
            },
            child: Text('奖励广告'),
          ),
          ElevatedButton(
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => BannerExample()),
              );
            },
            child: Text('横幅广告'),
          ),
        ],
      ),
    );
  }
}

// App Open 广告示例
class AppOpenExample extends StatelessWidget {
  const AppOpenExample({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      body: Column(
        children: [
          FutureBuilder<ManagedAppOpenAd>(
            future: getAd(),
            builder: (
              BuildContext context,
              AsyncSnapshot<ManagedAppOpenAd> snapshot,
            ) {
              if (snapshot.hasData) {
                snapshot.data?.showAppOpenAd();
              }
              return Container();
            },
          ),
        ],
      ),
    );
  }

  Future<ManagedAppOpenAd> getAd() async {
    await MobileAdsManager.instance.initializeSDK(
      appOpenAd: AppOpenAdInitializer(adUnitId: '<Ad Unit ID>'),
    );
    return MobileAdsManager.instance.getManagedAppOpenAd()!;
  }
}

// 插入式广告示例
class InterstitialExample extends StatelessWidget {
  const InterstitialExample({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      body: Column(
        children: [
          TextButton(
            onPressed: () {
              MobileAdsManager.instance
                  .getManagedInterstitialAdQueue(adUnitId: '<Ad Unit ID>')
                  ?.showInterstitialAd();
            },
            child: const Text(
              '显示插入式广告',
              style: TextStyle(
                fontSize: 20.0,
                color: Colors.white,
              ),
            ),
          ),
        ],
      ),
    );
  }
}

// 奖励广告示例
class RewardedExample extends StatelessWidget {
  const RewardedExample({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      body: Column(
        children: [
          TextButton(
            onPressed: () {
              MobileAdsManager.instance
                  .getManagedRewardedAdQueue(adUnitId: '<Ad Unit ID>')
                  ?.showRewardedAd(
                onUserEarnedReward: (AdWithoutView ad, RewardItem reward) {
                  // 奖励用户
                },
              );
            },
            child: const Text(
              '显示奖励广告',
              style: TextStyle(
                fontSize: 20.0,
                color: Colors.white,
              ),
            ),
          ),
        ],
      ),
    );
  }
}

// 横幅广告示例
class BannerExample extends StatefulWidget {
  const BannerExample({super.key});

  [@override](/user/override)
  State<BannerExample> createState() => _BannerExampleState();
}

class _BannerExampleState extends State<BannerExample> {
  late final ManagedBannerAd ad;

  [@override](/user/override)
  void initState() {
    super.initState();
    ad = MobileAdsManager.instance.getManagedBannerAd(
      adUnitId: '<Ad Unit ID>',
    )!;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      body: Column(
        children: [
          AdWidget(ad: ad.getAd()),
        ],
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    ad.dispose();
    super.dispose();
  }
}

更多关于Flutter广告管理插件google_mobile_ads_manager的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter广告管理插件google_mobile_ads_manager的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用Flutter广告管理插件google_mobile_ads_manager的示例代码。这个插件允许你在Flutter应用中集成Google移动广告(如横幅广告、插页式广告和奖励视频广告)。

首先,确保你的Flutter项目已经设置好,并且在pubspec.yaml文件中添加了google_mobile_ads依赖:

dependencies:
  flutter:
    sdk: flutter
  google_mobile_ads: ^X.Y.Z  # 请将X.Y.Z替换为最新版本号

然后,运行flutter pub get来获取依赖。

接下来,你需要配置Google AdMob。访问AdMob官网并创建一个应用来获取你的app_id和广告单元ID(如横幅广告单元ID、插页式广告单元ID等)。

初始化广告

在你的main.dart文件或者某个合适的位置初始化广告:

import 'package:flutter/material.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  MobileAds.instance.initialize();

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  BannerAd? _bannerAd;
  InterstitialAd? _interstitialAd;
  RewardedAd? _rewardedAd;

  @override
  void initState() {
    super.initState();
    createBannerAd();
    createInterstitialAd();
    createRewardedAd();
  }

  void createBannerAd() {
    _bannerAd = BannerAd(
      adUnitId: 'ca-app-pub-xxxxxxxxxxxxxxxx/xxxxxxxxxx', // 替换为你的横幅广告单元ID
      size: AdSize.banner,
      request: AdRequest(
        nonPersonalizedAds: true, // 启用非个性化广告
      ),
      listener: (AdEvent event, {String? error, BannerAd? ad}) {
        if (event == AdEvent.loaded) {
          _bannerAd?.show();
        }
      },
    );

    _bannerAd?.load();
  }

  void createInterstitialAd() {
    _interstitialAd = InterstitialAd(
      adUnitId: 'ca-app-pub-xxxxxxxxxxxxxxxx/xxxxxxxxxx', // 替换为你的插页式广告单元ID
      request: AdRequest(
        nonPersonalizedAds: true, // 启用非个性化广告
      ),
      listener: (AdEvent event, {String? error, InterstitialAd? ad}) {
        if (event == AdEvent.loaded) {
          _interstitialAd?.show();
        } else if (event == AdEvent.failedToLoad) {
          print('InterstitialAd failed to load: $error');
          _interstitialAd = createInterstitialAd().load();
        }
      },
    );

    _interstitialAd?.load();
  }

  void createRewardedAd() {
    _rewardedAd = RewardedAd(
      adUnitId: 'ca-app-pub-xxxxxxxxxxxxxxxx/xxxxxxxxxx', // 替换为你的奖励视频广告单元ID
      request: AdRequest(
        nonPersonalizedAds: true, // 启用非个性化广告
      ),
      rewardListener: (RewardedAdEvent event, {String? rewardType, int? rewardAmount, RewardedAd? ad}) {
        if (event == RewardedAdEvent.completed) {
          // 用户观看了完整广告,处理奖励逻辑
          print('User earned the reward.');
        } else if (event == RewardedAdEvent.failedToShow) {
          // 广告未能展示
          _rewardedAd = createRewardedAd().load();
        }
      },
    );

    _rewardedAd?.load();
  }

  void showInterstitialAd() {
    if (_interstitialAd?.isLoaded ?? false) {
      _interstitialAd?.show();
    } else {
      _interstitialAd = createInterstitialAd().load();
    }
  }

  void showRewardedAd() {
    if (_rewardedAd?.isLoaded ?? false) {
      _rewardedAd?.show();
    } else {
      _rewardedAd = createRewardedAd().load();
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Google Mobile Ads Manager Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            // 这里可以放置一个展示横幅广告的地方,比如使用AdWidget
            // _bannerAd?.adUnitId != null ? AdWidget(ad: _bannerAd!) : Container(),
            TextButton(
              onPressed: showInterstitialAd,
              child: Text('Show Interstitial Ad'),
            ),
            TextButton(
              onPressed: showRewardedAd,
              child: Text('Show Rewarded Ad'),
            ),
          ],
        ),
      ),
    );
  }
}

注意事项

  1. 广告单元ID:确保你替换了所有广告单元ID为你在AdMob上创建的实际ID。
  2. 测试广告:在开发阶段,你应该使用测试广告单元ID和测试设备,以避免产生真实的广告请求。你可以在AdMob的控制台中找到测试广告单元ID和测试设备ID。
  3. 权限:确保你的Android和iOS项目已经配置了必要的权限和设置,以允许广告展示。

这个示例展示了如何初始化横幅广告、插页式广告和奖励视频广告,并在用户点击按钮时展示它们。当然,根据你的实际需求,你可能需要调整广告展示的逻辑和UI布局。

回到顶部