Flutter广告管理插件google_mobile_ads_manager的使用
Flutter广告管理插件google_mobile_ads_manager的使用
功能特性
google_mobile_ads_manager
插件提供了与 AdMob SDK 交互的简单、简洁且完全管理的方式。以下是该插件的主要功能:
- 🚀 自动高效的广告预加载和队列管理
- 💪 智能请求重试机制(失败时自动重试)
- 🛡 错误处理
- ⚙️ 广告展示后自动销毁
- ⚡ 可选的概率性广告展示,以提升用户体验
- ❤️ 简洁直观的 API,按广告类型分离
- 🔋 内置电池(即开箱即用的功能)
初始化策略
广告可以通过两种方式初始化:
- 在初始化 AdMob SDK 时:通过在启动时提供一个
Initializer
对象列表。 - 在任何时间:通过向
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
更多关于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'),
),
],
),
),
);
}
}
注意事项
- 广告单元ID:确保你替换了所有广告单元ID为你在AdMob上创建的实际ID。
- 测试广告:在开发阶段,你应该使用测试广告单元ID和测试设备,以避免产生真实的广告请求。你可以在AdMob的控制台中找到测试广告单元ID和测试设备ID。
- 权限:确保你的Android和iOS项目已经配置了必要的权限和设置,以允许广告展示。
这个示例展示了如何初始化横幅广告、插页式广告和奖励视频广告,并在用户点击按钮时展示它们。当然,根据你的实际需求,你可能需要调整广告展示的逻辑和UI布局。