Flutter广告集成插件admob_lego的使用
简介
admob_lego
是一个用于在 Flutter 应用中集成 Google AdMob 广告的插件。通过此插件,开发者可以轻松地将原生广告和横幅广告添加到 Flutter 应用中。
安装
1. 安装 admob_lego
CLI 工具
首先,确保你已经安装了 lego_cli
。如果尚未安装,可以通过以下命令进行全局激活:
flutter pub global activate lego_cli
然后,创建一个新的 Lego 项目(如果你还没有):
lego create
2. 将 admob_lego
添加到项目中
在终端中运行以下命令,将 admob_lego
插件添加到你的项目中:
lego add admob_lego
AdMob 集成指南
1. 创建 AdMob 账户和应用
步骤:
- 注册一个 Google AdMob 账户:AdMob
- 在 AdMob 控制台中创建新应用,并获取你的 AdMob App ID 和广告单元 ID。
2. 配置 Android
打开 android/app/src/main/AndroidManifest.xml
文件,添加 AdMob App ID:
<manifest>
<application>
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-3940256099942544~3347511713"/> <!-- 测试用 AdMob App ID -->
</application>
</manifest>
3. 配置 iOS
打开 ios/Runner/Info.plist
文件,添加 AdMob App ID:
<key>GADApplicationIdentifier</key>
<string>ca-app-pub-3940256099942544~1458002511</string> <!-- 测试用 AdMob App ID -->
Android 原生 AdMob 集成指南
1. 修改 MainActivity.kt
在 android/app/src/main/kotlin/com/example/yourapp/MainActivity.kt
文件中添加以下代码:
package com.example.yourapp
import android.view.LayoutInflater
import android.widget.Button
import android.widget.ImageView
import android.widget.RatingBar
import android.widget.TextView
import com.google.android.gms.ads.nativead.NativeAd
import com.google.android.gms.ads.nativead.NativeAdView
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin
import io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin.NativeAdFactory
class MainActivity: FlutterActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
flutterEngine.plugins.add(GoogleMobileAdsPlugin())
super.configureFlutterEngine(flutterEngine)
GoogleMobileAdsPlugin.registerNativeAdFactory(
flutterEngine,
"adFactoryExample",
NativeAdFactoryExample(layoutInflater))
}
override fun cleanUpFlutterEngine(flutterEngine: FlutterEngine) {
GoogleMobileAdsPlugin.unregisterNativeAdFactory(flutterEngine, "adFactoryExample")
}
}
class NativeAdFactoryExample(private val layoutInflater: LayoutInflater): NativeAdFactory {
override fun createNativeAd(nativeAd: NativeAd?, customOptions: MutableMap<String, Any>?): NativeAdView {
val adView = layoutInflater.inflate(R.layout.my_native_ad, null) as NativeAdView
// 设置媒体视图
adView.mediaView = adView.findViewById(R.id.ad_media)
// 设置其他广告资产
adView.headlineView = adView.findViewById(R.id.ad_headline)
adView.bodyView = adView.findViewById(R.id.ad_body)
adView.callToActionView = adView.findViewById(R.id.ad_call_to_action)
adView.iconView = adView.findViewById(R.id.ad_app_icon)
adView.priceView = adView.findViewById(R.id.ad_price)
adView.starRatingView = adView.findViewById(R.id.ad_stars)
adView.storeView = adView.findViewById(R.id.ad_store)
adView.advertiserView = adView.findViewById(R.id.ad_advertiser)
// 必定存在的字段
(adView.headlineView as TextView).text = nativeAd?.headline
adView.mediaView?.mediaContent = nativeAd?.mediaContent
// 可选字段,需检查是否为空
if (nativeAd?.body == null) {
adView.bodyView?.visibility = View.INVISIBLE
} else {
adView.bodyView?.visibility = View.VISIBLE
(adView.bodyView as TextView).text = nativeAd.body
}
if (nativeAd?.callToAction == null) {
adView.callToActionView?.visibility = View.INVISIBLE
} else {
adView.callToActionView?.visibility = View.VISIBLE
(adView.callToActionView as Button).text = nativeAd.callToAction
}
if (nativeAd?.icon == null) {
adView.iconView?.visibility = View.GONE
} else {
(adView.iconView as ImageView).setImageDrawable(nativeAd.icon!!.drawable)
adView.iconView?.visibility = View.VISIBLE
}
if (nativeAd?.price == null) {
adView.priceView?.visibility = View.INVISIBLE
} else {
adView.priceView?.visibility = View.VISIBLE
(adView.priceView as TextView).text = nativeAd.price
}
if (nativeAd?.store == null) {
adView.storeView?.visibility = View.INVISIBLE
} else {
adView.storeView?.visibility = View.VISIBLE
(adView.storeView as TextView).text = nativeAd.store
}
if (nativeAd?.starRating == null) {
adView.starRatingView?.visibility = View.INVISIBLE
} else {
(adView.starRatingView as RatingBar).rating = nativeAd.starRating!!.toFloat()
adView.starRatingView?.visibility = View.VISIBLE
}
if (nativeAd?.advertiser == null) {
adView.advertiserView?.visibility = View.INVISIBLE
} else {
adView.advertiserView?.visibility = View.VISIBLE
(adView.advertiserView as TextView).text = nativeAd.advertiser
}
// 告诉 Google Mobile Ads SDK 广告已填充
if (nativeAd != null) {
adView.setNativeAd(nativeAd)
}
return adView
}
}
2. 创建 my_native_ad.xml
在 android/app/src/main/res/layout/my_native_ad.xml
中定义广告布局:
<com.google.android.gms.ads.nativead.NativeAdView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="#FFFFFF"
android:minHeight="50dp"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:paddingTop="3dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/ad_app_icon"
android:layout_width="40dp"
android:layout_height="40dp"
android:adjustViewBounds="true"
android:paddingBottom="5dp"
android:paddingEnd="5dp"
android:paddingRight="5dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/ad_headline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#0000FF"
android:textSize="16sp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/ad_advertiser"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="bottom"
android:textSize="14sp"
android:textStyle="bold"/>
<RatingBar
android:id="@+id/ad_stars"
style="?android:attr/ratingBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:isIndicator="true"
android:numStars="5"
android:stepSize="0.5" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/ad_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:layout_marginEnd="20dp"
android:textSize="12sp" />
<com.google.android.gms.ads.nativead.MediaView
android:id="@+id/ad_media"
android:layout_gravity="center_horizontal"
android:layout_width="250dp"
android:layout_height="175dp"
android:layout_marginTop="5dp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:orientation="horizontal"
android:paddingBottom="10dp"
android:paddingTop="10dp">
<TextView
android:id="@+id/ad_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:paddingStart="5dp"
android:paddingRight="5dp"
android:paddingEnd="5dp"
android:textSize="12sp" />
<TextView
android:id="@+id/ad_store"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:paddingStart="5dp"
android:paddingRight="5dp"
android:paddingEnd="5dp"
android:textSize="12sp" />
<Button
android:id="@+id/ad_call_to_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</com.google.android.gms.ads.nativead.NativeAdView>
iOS 原生 AdMob 集成指南
1. 修改 AppDelegate.swift
在 ios/Runner/AppDelegate.swift
文件中添加以下代码:
import UIKit
import Flutter
@objc class NativeAdFactoryExample: NSObject, FLTNativeAdFactory {
func createNativeAd(_ nativeAd: GADNativeAd, customOptions: [AnyHashable : Any]? = nil) -> GADNativeAdView? {
// 加载自定义 XIB 文件
let nativeAdView = Bundle.main.loadNibNamed("NativeAdView", owner: nil, options: nil)?.first as! GADNativeAdView
// 关联广告对象
nativeAdView.nativeAd = nativeAd
// 设置广告内容
(nativeAdView.headlineView as? UILabel)?.text = nativeAd.headline
nativeAdView.mediaView?.mediaContent = nativeAd.mediaContent
(nativeAdView.bodyView as? UILabel)?.text = nativeAd.body
(nativeAdView.iconView as? UIImageView)?.image = nativeAd.icon?.image
(nativeAdView.starRatingView as? UIImageView)?.image = imageOfStars(from: nativeAd.starRating)
(nativeAdView.storeView as? UILabel)?.text = nativeAd.store
(nativeAdView.priceView as? UILabel)?.text = nativeAd.price
(nativeAdView.advertiserView as? UILabel)?.text = nativeAd.advertiser
(nativeAdView.callToActionView as? UIButton)?.setTitle(nativeAd.callToAction, for: .normal)
// 禁用用户交互以确保正确处理点击事件
nativeAdView.callToActionView?.isUserInteractionEnabled = false
return nativeAdView
}
private func imageOfStars(from starRating: NSDecimalNumber?) -> UIImage? {
guard let rating = starRating?.doubleValue else { return nil }
if rating >= 5 {
return UIImage(named: "stars_5")
} else if rating >= 4.5 {
return UIImage(named: "stars_4_5")
} else if rating >= 4 {
return UIImage(named: "stars_4")
} else if rating >= 3.5 {
return UIImage(named: "stars_3_5")
} else {
return nil
}
}
}
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
// 注册原生广告工厂
FLTGoogleMobileAdsPlugin.registerNativeAdFactory(self, factoryId: "adFactoryExample", nativeAdFactory: NativeAdFactoryExample())
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
2. 创建 NativeAdView.xib
在 Xcode
在 Xcode 中创建名为 NativeAdView.xib
的文件,定义广告视图的 UI:
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="17156" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<deployment version="2048" identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17125"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="iN0-l3-epB" customClass="GADNativeAdView">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="iNa-bH-h1m"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Advertiser" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="GTT-Yh-eSq"/>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" placeholderIntrinsicWidth="100" placeholderIntrinsicHeight="17" translatesAutoresizingMaskIntoConstraints="NO" id="2Of-AP-0h9"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" verticalCompressionResistancePriority="751" text="Body that is really really long and can take up to two lines or sometimes even more." textAlignment="justified" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="PEQ-D9-2Vv"/>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="E5w-YA-UY8"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Price" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ysb-of-cat"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Store" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hwF-UL-Q8H"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" horizontalCompressionResistancePriority="751" text="Headline" textAlignment="justified" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="beR-eV-DX1"/>
<view contentMode="scaleAspectFit" translatesAutoresizingMaskIntoConstraints="NO" id="fNp-yu-K4i" customClass="GADMediaView"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Ad" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="lp1-oz-XOs"/>
</subviews>
<color key="backgroundColor" red="1" green="0.98303861469999998" blue="0.92887652860000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
</objects>
</document>
更多关于Flutter广告集成插件admob_lego的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
admob_lego
是一个用于在 Flutter 应用中集成 Google AdMob 广告的插件。它提供了简单易用的 API,帮助开发者快速集成横幅广告、插页式广告和奖励广告。以下是如何使用 admob_lego
插件的基本步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 admob_lego
插件的依赖:
dependencies:
flutter:
sdk: flutter
admob_lego: ^latest_version
然后运行 flutter pub get
来安装依赖。
2. 初始化 AdMob
在使用广告之前,需要初始化 AdMob。通常可以在 main.dart
文件中进行初始化:
import 'package:admob_lego/admob_lego.dart';
import 'package:flutter/material.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await AdmobLego.initialize();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'AdMob Example',
home: HomeScreen(),
);
}
}
3. 添加横幅广告
横幅广告通常显示在屏幕的顶部或底部。以下是如何在应用中添加横幅广告的示例:
import 'package:admob_lego/admob_lego.dart';
import 'package:flutter/material.dart';
class HomeScreen extends StatefulWidget {
[@override](/user/override)
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
late BannerAd _bannerAd;
[@override](/user/override)
void initState() {
super.initState();
_bannerAd = BannerAd(
adUnitId: 'your_banner_ad_unit_id',
size: AdSize.banner,
listener: BannerAdListener(
onAdLoaded: (Ad ad) => print('Banner Ad loaded.'),
onAdFailedToLoad: (Ad ad, LoadAdError error) {
ad.dispose();
print('Banner Ad failed to load: $error');
},
onAdOpened: (Ad ad) => print('Banner Ad opened.'),
onAdClosed: (Ad ad) => print('Banner Ad closed.'),
),
)..load();
}
[@override](/user/override)
void dispose() {
_bannerAd.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('AdMob Example'),
),
body: Center(
child: Text('Hello, AdMob!'),
),
bottomNavigationBar: Container(
alignment: Alignment.center,
child: AdWidget(ad: _bannerAd),
width: _bannerAd.size.width.toDouble(),
height: _bannerAd.size.height.toDouble(),
),
);
}
}
4. 添加插页式广告
插页式广告通常在全屏显示,例如在应用的自然过渡点(如关卡之间)。以下是如何加载和显示插页式广告的示例:
import 'package:admob_lego/admob_lego.dart';
import 'package:flutter/material.dart';
class HomeScreen extends StatefulWidget {
[@override](/user/override)
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
InterstitialAd? _interstitialAd;
[@override](/user/override)
void initState() {
super.initState();
_loadInterstitialAd();
}
void _loadInterstitialAd() {
InterstitialAd.load(
adUnitId: 'your_interstitial_ad_unit_id',
request: AdRequest(),
adLoadCallback: InterstitialAdLoadCallback(
onAdLoaded: (InterstitialAd ad) {
_interstitialAd = ad;
_interstitialAd?.setFullScreenContentCallback(FullScreenContentCallback(
onAdDismissedFullScreenContent: (InterstitialAd ad) {
ad.dispose();
_loadInterstitialAd();
},
onAdFailedToShowFullScreenContent: (InterstitialAd ad, AdError error) {
ad.dispose();
_loadInterstitialAd();
},
));
},
onAdFailedToLoad: (LoadAdError error) {
print('InterstitialAd failed to load: $error');
},
),
);
}
void _showInterstitialAd() {
if (_interstitialAd != null) {
_interstitialAd?.show();
} else {
print('InterstitialAd is not ready yet.');
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('AdMob Example'),
),
body: Center(
child: ElevatedButton(
onPressed: _showInterstitialAd,
child: Text('Show Interstitial Ad'),
),
),
);
}
}
5. 添加奖励广告
奖励广告通常用于激励用户完成某些操作(如观看视频广告以获得奖励)。以下是如何加载和显示奖励广告的示例:
import 'package:admob_lego/admob_lego.dart';
import 'package:flutter/material.dart';
class HomeScreen extends StatefulWidget {
[@override](/user/override)
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
RewardedAd? _rewardedAd;
[@override](/user/override)
void initState() {
super.initState();
_loadRewardedAd();
}
void _loadRewardedAd() {
RewardedAd.load(
adUnitId: 'your_rewarded_ad_unit_id',
request: AdRequest(),
rewardedAdLoadCallback: RewardedAdLoadCallback(
onAdLoaded: (RewardedAd ad) {
_rewardedAd = ad;
_rewardedAd?.setFullScreenContentCallback(FullScreenContentCallback(
onAdDismissedFullScreenContent: (RewardedAd ad) {
ad.dispose();
_loadRewardedAd();
},
onAdFailedToShowFullScreenContent: (RewardedAd ad, AdError error) {
ad.dispose();
_loadRewardedAd();
},
));
},
onAdFailedToLoad: (LoadAdError error) {
print('RewardedAd failed to load: $error');
},
),
);
}
void _showRewardedAd() {
if (_rewardedAd != null) {
_rewardedAd?.show(onUserEarnedReward: (AdWithoutView ad, RewardItem reward) {
print('User earned reward: ${reward.amount} ${reward.type}');
});
} else {
print('RewardedAd is not ready yet.');
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('AdMob Example'),
),
body: Center(
child: ElevatedButton(
onPressed: _showRewardedAd,
child: Text('Show Rewarded Ad'),
),
),
);
}
}