Flutter广告集成插件nestads的使用
Flutter广告集成插件nestads的使用
NestAds Flutter SDK 是一个用于广告追踪及日志收集的SDK。
本文档将指导你如何安装及使用NestAds Flutter SDK。
准备
要求条件
- Flutter 3.24.0 及以上版本
- Dart 3.5.0 及以上版本
- iOS 14.0 及以上版本
- 最小SDK版本: 23 (Android 6.0 Marshmallow)
- 目标SDK版本: 34 (Android 14)
依赖项
NestAds Flutter SDK 使用以下库:
sdk: flutter
package_info_plus: ^8.1.2
crypto: ^3.0.6
convert: ^3.0.1
encrypt: ^5.0.0
archive: ^4.0.2
http: ^1.1.2
timezone: ^0.9.2
安装
步骤1: 在pubspec.yaml
文件中添加依赖项
在pubspec.yaml
文件的dependencies
下添加以下内容:
dependencies:
nestads: [最新版本]
也可以在终端输入以下命令来添加依赖项:
flutter pub add nestads
步骤2: 获取依赖包
在终端输入以下命令来获取依赖包:
flutter pub get
使用方法
现在可以在Dart代码中导入并使用NestAds了。
import 'package:nestads/nestads.dart';
初始化
在main()
函数中调用NestAds.instance.initialize()
方法进行初始化。初始化时必须提供userId
和deviceInfo
(包含osName
, deviceBrand
, deviceModel
)。
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化时提供userId和deviceInfo
await NestAds.instance.initialize(
userId: '6fbfb26a-fdff-40ff-9722-269def2e72ad',
deviceInfo: {
'osName': 'Android',
'deviceBrand': 'samsung',
'deviceModel': 'SM-S926N',
},
);
// 设置跟踪日志选项
NestAds.instance.setTrackingLogOptions(size: 10, duration: 5);
runApp(SampleApp());
}
设置跟踪日志选项
可以使用NestAds.instance.setTrackingLogOptions()
方法设置日志存储的最大数量和时间间隔。如果未调用该方法,则默认为10条日志,存储时间为5秒。
void setTrackingLogOptions() {
NestAds.instance.setTrackingLogOptions(size: 10, duration: 5);
}
事件追踪
使用NestAds.instance.sendTrackingLog()
方法进行事件追踪。
必须参数
type
: 日志类型eventId
: 日志事件IDplacementId
: 广告位ID
可选参数
misc
: 包含的其他信息requestId
: 请求IDimpressionOrder
: 实际曝光顺序
注意:requestId
或misc.requestId
中至少有一个必须存在。
示例代码
void trackEvent() {
// 处理来自排名者的响应
NestAds.instance.sendTrackingLog(
type: 'VIEW',
eventId: event['event_id'],
placementId: event['placement_id'],
misc: event['misc'],
);
// 处理非排名者的响应
NestAds.instance.sendTrackingLog(
type: 'VIEW',
requestId: event['request_id'],
eventId: event['event_id'],
placementId: event['placement_id'],
);
}
示例代码
import 'package:flutter/material.dart';
import 'package:nestads/nestads.dart';
import 'package:visibility_detector/visibility_detector.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化时提供userId和deviceInfo
await NestAds.instance.initialize(
userId: '6fbfb26a-fdff-40ff-9722-269def2e72ad',
deviceInfo: {
'osName': 'Android',
'deviceBrand': 'samsung',
'deviceModel': 'SM-S926N',
},
);
// 设置跟踪日志选项
NestAds.instance.setTrackingLogOptions(size: 10, duration: 5);
runApp(SampleApp());
}
class SampleApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
}
class HomePage extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('NestAds')),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => AdsPage()),
);
},
child: Text('进入广告页面'),
),
),
);
}
}
class AdsPage extends StatelessWidget {
final List<Map<String, dynamic>> events = List.generate(
100,
(index) {
return {
'request_id': index.toString(),
'event_id': index.toString(),
'placement_id': index.toString(),
"impression_order": index + 1,
'misc': {
"request_id": index.toString(),
"impression_order": index + 1,
"model_version": "v1"
}
};
},
);
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('广告事件页面')),
body: GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: 1.0,
mainAxisSpacing: 50.0,
),
itemCount: events.length,
itemBuilder: (context, index) {
final event = events[index];
return VisibilityDetector(
key: Key('ad-${event['event_id']}'),
onVisibilityChanged: (visibilityInfo) {
if (visibilityInfo.visibleFraction >= 0.5) {
if (index < 50) {
// 处理来自排名者的响应
NestAds.instance.sendTrackingLog(
type: 'VIEW',
eventId: event['event_id'],
placementId: event['placement_id'],
misc: event['misc'],
);
} else {
// 处理非排名者的响应
NestAds.instance.sendTrackingLog(
type: 'VIEW',
requestId: event['request_id'],
eventId: event['event_id'],
placementId: event['placement_id'],
impressionOrder: event['impression_order']);
}
}
},
child: GestureDetector(
onTap: () {
// 点击事件处理
if (index < 50) {
// 处理来自排名者的响应
NestAds.instance.sendTrackingLog(
type: 'ENTER',
eventId: event['event_id'],
placementId: event['placement_id'],
misc: event['misc']);
} else {
// 处理非排名者的响应
NestAds.instance.sendTrackingLog(
type: 'ENTER',
requestId: event['request_id'],
eventId: event['event_id'],
placementId: event['placement_id'],
impressionOrder: event['impression_order']);
}
Navigator.push(
context,
MaterialPageRoute(builder: (context) => AdDetailPage(event: event)),
);
},
child: Container(
margin: EdgeInsets.all(8.0),
color: Colors.blueAccent,
child: Center(
child: Text(
'事件 \n${event['event_id']}',
style: TextStyle(color: Colors.white, fontSize: 20),
),
),
),
),
);
},
),
);
}
}
class AdDetailPage extends StatelessWidget {
final Map<String, dynamic> event;
AdDetailPage({required this.event});
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('广告详情页')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'事件 ${event['event_id']} \n',
style: TextStyle(fontSize: 24),
textAlign: TextAlign.center,
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
int eventId = int.parse(event['event_id']);
// 处理INPROGRESS事件
if (eventId < 50) {
// 处理来自排名者的响应
NestAds.instance.sendTrackingLog(
type: 'INPROGRESS',
eventId: event['event_id'],
placementId: event['placement_id'],
misc: event['misc'],
);
} else {
// 处理非排名者的响应
NestAds.instance.sendTrackingLog(
type: 'INPROGRESS',
requestId: event['request_id'],
eventId: event['event_id'],
placementId: event['placement_id'],
impressionOrder: event['impression_order']);
}
},
child: Text('参与INPROGRESS'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
int eventId = int.parse(event['event_id']);
// 处理COMPLETE事件
if (eventId < 50) {
// 处理来自排名者的响应
NestAds.instance.sendTrackingLog(
type: 'COMPLETE',
eventId: event['event_id'],
placementId: event['placement_id'],
misc: event['misc'],
);
} else {
// 处理非排名者的响应
NestAds.instance.sendTrackingLog(
type: 'COMPLETE',
requestId: event['request_id'],
eventId: event['event_id'],
placementId: event['placement_id'],
impressionOrder: event['impression_order']);
}
},
child: Text('领取COMPLETE奖励'),
),
],
),
),
);
}
}
更多关于Flutter广告集成插件nestads的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
nestads
是一个用于在 Flutter 应用中集成广告的插件。它支持多种广告格式,包括横幅广告、插页式广告、原生广告和激励视频广告。以下是如何在 Flutter 项目中使用 nestads
插件的简要指南。
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 nestads
插件的依赖。
dependencies:
flutter:
sdk: flutter
nestads: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来获取依赖。
2. 初始化 nestads
在应用启动时,你需要初始化 nestads
插件。通常,你可以在 main.dart
文件中进行初始化。
import 'package:flutter/material.dart';
import 'package:nestads/nestads.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await NestAds.initialize(
appId: 'your_app_id', // 替换为你的应用ID
isTestMode: true, // 测试模式,发布时设置为 false
);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
3. 显示横幅广告
你可以在应用的任何地方显示横幅广告。以下是一个简单的示例:
import 'package:flutter/material.dart';
import 'package:nestads/nestads.dart';
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Demo Home Page'),
),
body: Column(
children: [
Expanded(
child: Center(
child: Text('Hello, world!'),
),
),
NestBannerAd(
adUnitId: 'your_banner_ad_unit_id', // 替换为你的横幅广告单元ID
adSize: AdSize.banner,
),
],
),
);
}
}
4. 显示插页式广告
插页式广告通常在用户完成某些操作后显示。以下是如何加载和显示插页式广告的示例:
import 'package:flutter/material.dart';
import 'package:nestads/nestads.dart';
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
NestInterstitialAd? _interstitialAd;
void _loadInterstitialAd() {
NestInterstitialAd.load(
adUnitId: 'your_interstitial_ad_unit_id', // 替换为你的插页式广告单元ID
request: AdRequest(),
adLoadCallback: NestInterstitialAdLoadCallback(
onAdLoaded: (ad) {
setState(() {
_interstitialAd = ad;
});
},
onAdFailedToLoad: (error) {
print('InterstitialAd failed to load: $error');
},
),
);
}
void _showInterstitialAd() {
if (_interstitialAd != null) {
_interstitialAd!.show();
} else {
print('InterstitialAd is not ready yet.');
}
}
@override
void initState() {
super.initState();
_loadInterstitialAd();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Demo Home Page'),
),
body: Center(
child: ElevatedButton(
onPressed: _showInterstitialAd,
child: Text('Show Interstitial Ad'),
),
),
);
}
}
5. 显示激励视频广告
激励视频广告通常用于奖励用户观看完整视频。以下是如何加载和显示激励视频广告的示例:
import 'package:flutter/material.dart';
import 'package:nestads/nestads.dart';
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
NestRewardedAd? _rewardedAd;
void _loadRewardedAd() {
NestRewardedAd.load(
adUnitId: 'your_rewarded_ad_unit_id', // 替换为你的激励视频广告单元ID
request: AdRequest(),
rewardedAdLoadCallback: NestRewardedAdLoadCallback(
onAdLoaded: (ad) {
setState(() {
_rewardedAd = ad;
});
},
onAdFailedToLoad: (error) {
print('RewardedAd failed to load: $error');
},
),
);
}
void _showRewardedAd() {
if (_rewardedAd != null) {
_rewardedAd!.show(
onUserEarnedReward: (RewardItem reward) {
print('User earned reward: ${reward.amount} ${reward.type}');
},
);
} else {
print('RewardedAd is not ready yet.');
}
}
@override
void initState() {
super.initState();
_loadRewardedAd();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Demo Home Page'),
),
body: Center(
child: ElevatedButton(
onPressed: _showRewardedAd,
child: Text('Show Rewarded Ad'),
),
),
);
}
}
6. 显示原生广告
原生广告允许你自定义广告的外观,使其与应用的设计风格一致。以下是如何加载和显示原生广告的示例:
import 'package:flutter/material.dart';
import 'package:nestads/nestads.dart';
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Demo Home Page'),
),
body: Center(
child: NestNativeAd(
adUnitId: 'your_native_ad_unit_id', // 替换为你的原生广告单元ID
factoryId: 'your_factory_id', // 替换为你的原生广告工厂ID
request: AdRequest(),
listener: NativeAdListener(
onAdLoaded: (ad) {
print('NativeAd loaded');
},
onAdFailedToLoad: (error) {
print('NativeAd failed to load: $error');
},
),
),
),
);
}
}
7. 处理生命周期
为了确保广告正确地加载和显示,你需要在应用的生命周期中处理广告的状态。例如,在 dispose
方法中释放广告资源。
@override
void dispose() {
_interstitialAd?.dispose();
_rewardedAd?.dispose();
super.dispose();
}
8. 测试模式
在开发和测试阶段,建议启用测试模式以确保广告不会对真实用户展示。你可以在初始化 nestads
时设置 isTestMode
为 true
。
await NestAds.initialize(
appId: 'your_app_id',
isTestMode: true,
);