在我的 Flutter firebase_admob(IOS开发版)这篇文章介绍了 firebase_admob 的基本使用,这篇搞个升级版,将 firebase 调取广告封装成单例,供全局使用。
vad_instance.dart
在该文件中举例了“插页式广告”和“激励广告”,两种广告的封装形式有很大的不同,由于激励广告需要用户看一小片段广告,我们更需要关注用户在观看广告期间的行为并对其进行了动态的监听。插页式广告只需预加载成功后触发弹出即可。
【 注意:插页式广告的 InterstitialAd 方法只能加载一次 】
import 'package:firebase_admob/firebase_admob.dart';
import 'package:rxdart/rxdart.dart';
const String AD_MOB_APP_ID = 'ca-app-pub-################~##########';
const String AD_CHA_YE = 'ca-app-pub-3940256099942544/1033173712';
const String AD_JI_LI = 'ca-app-pub-3940256099942544/1712485313';
class VadInstance {
// 单例公开访问点
factory VadInstance() => _getInstance();
// 静态私有成员,没有初始化
static VadInstance _vadInstance;
static VadInstance get instance => _getInstance();
// 激励广告监听变量
BehaviorSubject<bool> _loadedAsBehaviorSubject = BehaviorSubject();
/* ====================== 插页式广告部分开始 ====================== */
InterstitialAd _interstitialAd;
InterstitialAd createInterstitialAd() {
return InterstitialAd(
adUnitId: AD_CHA_YE,
targetingInfo: targetingInfo,
listener: (MobileAdEvent event) {
if (event == MobileAdEvent.failedToLoad) {
_interstitialAd = createInterstitialAd();
}
if (event == MobileAdEvent.closed) {
_interstitialAd = createInterstitialAd();
}
})..load();
}
/* ====================== 插页式广告部分结束 ====================== */
// 私有构造函数
VadInstance._() {
// 初始化 firebase_admob
FirebaseAdMob.instance.initialize(appId: AD_MOB_APP_ID);
_interstitialAd = createInterstitialAd();
/* ====================== 激励广告部分开始 ====================== */
RewardedVideoAd.instance.load(adUnitId: AD_JI_LI, targetingInfo: targetingInfo);
RewardedVideoAd.instance.listener =
(RewardedVideoAdEvent event, {String rewardType, int rewardAmount}) {
if (event == RewardedVideoAdEvent.loaded) {
_loadedAsBehaviorSubject.value = true;
}
if (event == RewardedVideoAdEvent.closed) {
_loadedAsBehaviorSubject.value = false;
}
if (event == RewardedVideoAdEvent.failedToLoad) {
_loadedAsBehaviorSubject.value = false;
}
};
_loadedAsBehaviorSubject.listen((loaded) {
if (!loaded) {
RewardedVideoAd.instance.load(adUnitId: AD_JI_LI, targetingInfo: targetingInfo);
}
});
/* ====================== 激励广告部分结束 ====================== */
}
// 静态、同步、私有访问点
static VadInstance _getInstance() {
if (_vadInstance == null) {
_vadInstance = VadInstance._();
}
return _vadInstance;
}
static final MobileAdTargetingInfo targetingInfo = new MobileAdTargetingInfo(
keywords: <String>['flutterio', 'beautiful apps'],
contentUrl: 'https://flutter.io',
birthday: DateTime.now(),
testDevices: <String>[],
);
// 页面中用户点击操作后调取 VadInstance.instance.showRewardedVideoAd(); 即可
Future<bool> showRewardedVideoAd() {
if (_loadedAsBehaviorSubject.hasValue && _loadedAsBehaviorSubject.value) {
RewardedVideoAd.instance.show();
} else {
// 没加载出来广告
}
}
// 页面中用户点击操作后调取 VadInstance.instance.showInterstitialAd(); 即可
Future<bool> showInterstitialAd() async {
if (await _interstitialAd.isLoaded()) {
_interstitialAd.show();
}
else {
// 没加载出来广告
}
}
}
最后,在项目的入口文件处加上这么一句,就可以提前加载出广告,以便用户触发弹广告的操作后能瞬间展示出广告,而不是触发弹广告的操作后先去请求广告再展示。
VadInstance.instance;