yf_ads 0.4.0
yf_ads: ^0.4.0 copied to clipboard
A new Flutter ads project.
example/lib/main.dart
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:yf_ads/bean/yf_ads_init_sdk_android_bean.dart';
import 'package:yf_ads/bean/yf_ads_init_sdk_ios_bean.dart';
import 'package:yf_ads/bean/yf_ads_interaction_bean.dart';
import 'package:yf_ads/bean/yf_ads_reward_video_bean.dart';
import 'package:yf_ads/bean/yf_ads_splash_bean.dart';
import 'package:yf_ads/bean/yf_ads_top_push_bean.dart';
import 'package:yf_ads/callbacks/yf_ads_callback.dart';
import 'package:yf_ads/callbacks/yf_ads_reward_video_callback.dart';
import 'package:yf_ads/managers/yf_interstitial.dart';
import 'package:yf_ads/managers/yf_rewarded.dart';
import 'package:yf_ads/managers/yf_splash.dart';
import 'package:yf_ads/managers/yf_top_push.dart';
import 'package:yf_ads/yf_ads.dart';
import 'package:yf_ads_example/yf_ads_request_fusion_banner_list_view.dart';
import 'package:yf_ads_example/yf_ads_request_fusion_banner_view.dart';
import 'yf_ads_request_banner_list_view.dart';
import 'yf_ads_request_banner_view.dart';
import 'yf_ads_request_express_feed_list_view.dart';
import 'yf_ads_request_express_feed_view.dart';
import 'yf_ads_request_native_draw_feed_video_view.dart';
import 'yf_ads_request_stream_view.dart';
import 'yf_ads_reward_video_extra_bean.dart';
void main() {
runApp(const MaterialApp(
debugShowCheckedModeBanner: false,
home: MyApp(),
));
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
var reaperFlutterPlugin;
int _currentIndex = 0;
bool _pageAbsorbing = false;
// 使用三目运算符来判断平台并设置 ScrollPhysics
ScrollPhysics pagePhysics = defaultTargetPlatform == TargetPlatform.android
? ClampingScrollPhysics()
: BouncingScrollPhysics();
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
reaperFlutterPlugin = YFAds.instance;
initReaperSdk();
loadColdSplashAd(true);
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
if (state == AppLifecycleState.resumed) {
print("切换到了前台");
} else if (state == AppLifecycleState.paused) {
print("切换到了后台");
}
}
@override
void dispose() {
print("dispose");
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
Future<void> initReaperSdk() async {
var reaperInitSdkBaseBean;
if (Platform.isAndroid) {
const RELEASE_APP_ID = "24f8e0ba-697e-4ee5-b4fb-30cc1c9f2031";
const RELEASE_APP_KEY = "24f8e0ba-697e-4ee5-b4fb-30cc1c9f2031";
reaperInitSdkBaseBean = const YFAdsInitSDKAndroidBean(
appId: RELEASE_APP_ID,
appKey: RELEASE_APP_KEY,
ext1: "ccc",
ext2: "ddd",
u1: 'userId',
enableLog: true,
envTest: true);
} else if (Platform.isIOS) {
const RELEASE_APP_ID = "c5074e30-2310-4bf3-958a-5c933f029f4c";
const RELEASE_APP_KEY = "c5074e30-2310-4bf3-958a-5c933f029f4c";
reaperInitSdkBaseBean = const YFAdsInitSDKIOSBean(
// ext1: "c1",
// ext2: "c2",
u1: 'userId',
enableLog: true,
enableLocation: false,
appId: RELEASE_APP_ID,
appKey: RELEASE_APP_KEY);
}
await reaperFlutterPlugin.initAdsSDK(reaperInitSdkBaseBean);
}
Future<void> onlyLoadSplashAd() async {
loadSplashAd(false);
}
Future<void> loadColdSplashAd(var loadAndShow) async {
var positionId;
if (Platform.isAndroid) {
positionId = "da54a0c6-62b0-4756-a975-a1bd122b4d61";
} else if (Platform.isIOS) {
positionId = "c224595375934c0a89702e43a3eaea6b";
}
var reaperSplashBean = YFAdsSplashBean(
tag: "Splash",
positionId: positionId,
loadAndShow: loadAndShow,
callBack: splashAdCallBack);
await YFSplashManager.loadSplashAd(reaperSplashBean);
}
Future<void> loadSplashAd(var loadAndShow) async {
var positionId;
if (Platform.isAndroid) {
positionId = "da54a0c6-62b0-4756-a975-a1bd122b4d61";
} else if (Platform.isIOS) {
positionId = "0bbcfd82-779d-4ff8-9a38-781b31c5ab61";
}
var reaperSplashBean = YFAdsSplashBean(
tag: "Splash",
positionId: positionId,
loadAndShow: loadAndShow,
callBack: splashAdCallBack);
await YFSplashManager.loadSplashAd(reaperSplashBean);
}
Future<void> showSplashAd() async {
await YFSplashManager.showSplashAd();
}
Future<void> loadInsertAd() async {
var positionId;
if (Platform.isAndroid) {
positionId = "503e92d8-2e2a-472c-b045-0f0f0282830c";
} else if (Platform.isIOS) {
positionId = "963a6e18-6a5d-486a-9407-225f6c4d3f24";
}
var reaperInsertBean = YFAdsInteractionBean(
tag: "custom",
positionId: positionId,
loadAndShow: false,
callBack: insertAdCallBack);
await YFInterstitialManager.loadInterstitialAd(reaperInsertBean);
}
Future<void> showInsertAd() async {
await YFInterstitialManager.showInterstitialAd();
}
Future<void> loadTopPushAd() async {
var positionId;
if (Platform.isAndroid) {
positionId = "6b7aa0c456f04484aeca4ffa61638554";
} else if (Platform.isIOS) {
positionId = "9df2a82c19d54889b987efa767b551d3";
}
var reaperTopPushBean = YFAdsTopPushBean(
tag: "topPush",
positionId: positionId,
loadAndShow: false,
callBack: topPushAdCallBack);
await YFTopPushManager.loadTopPushAd(reaperTopPushBean);
}
Future<void> showTopPushAd() async {
await YFTopPushManager.showTopPushAd();
}
void insertAdCallBack(YFAdsCallBack data) {
print("insertAdCallBack:${data.method} ${data.tag}");
if (defaultTargetPlatform == TargetPlatform.android) {
if (data.method == YFAdsCallBack.YF_ADS_ANDROID_SUCCESS) {
Fluttertoast.showToast(
msg: "加载成功,AdnID:${data.adnID},RID:${data.rid}",
toastLength: Toast.LENGTH_SHORT);
} else if (data.method == YFAdsCallBack.YF_ADS_ANDROID_SHOW_SUCCESS) {
Fluttertoast.showToast(
msg: "曝光成功,AdnID:${data.adnID},RID:${data.rid}, ECPM:${data.ecpm}",
toastLength: Toast.LENGTH_SHORT);
}
}
if (defaultTargetPlatform == TargetPlatform.iOS) {
switch (data.method) {
case 'yfInterstitialAdDidLoad':
Fluttertoast.showToast(
msg: "插屏加载成功,AdnID:${data.adnID},RID:${data.rid}",
toastLength: Toast.LENGTH_SHORT);
break;
case 'yfInterstitialAdLoadFail':
{
if (defaultTargetPlatform == TargetPlatform.iOS) {
setState(() {
_pageAbsorbing = false;
});
}
Fluttertoast.showToast(
msg: "插屏加载失败", toastLength: Toast.LENGTH_SHORT);
}
break;
case 'yfInterstitialAdDidClick':
Fluttertoast.showToast(
msg: "插屏广告点击", toastLength: Toast.LENGTH_SHORT);
break;
case 'yfInterstitialAdDidExposure':
{
if (Platform.isIOS) {
setState(() {
_pageAbsorbing = true;
});
}
Fluttertoast.showToast(
msg: "插屏广告曝光", toastLength: Toast.LENGTH_SHORT);
setState(() {
pagePhysics = NeverScrollableScrollPhysics();
});
}
break;
case 'yfInterstitialAdDidClose':
{
if (defaultTargetPlatform == TargetPlatform.iOS) {
setState(() {
_pageAbsorbing = false;
});
}
Fluttertoast.showToast(
msg: "插屏广告关闭", toastLength: Toast.LENGTH_SHORT);
setState(() {
pagePhysics = defaultTargetPlatform == TargetPlatform.android
? ClampingScrollPhysics()
: BouncingScrollPhysics();
});
}
break;
default:
}
}
}
void topPushAdCallBack(YFAdsCallBack data) {
print("topPushAdCallBack:${data.method} ${data.tag}");
if (defaultTargetPlatform == TargetPlatform.android) {
if (data.method == YFAdsCallBack.YF_ADS_ANDROID_SUCCESS) {
Fluttertoast.showToast(
msg: "加载成功,AdnID:${data.adnID},RID:${data.rid}",
toastLength: Toast.LENGTH_SHORT);
} else if (data.method == YFAdsCallBack.YF_ADS_ANDROID_SHOW_SUCCESS) {
Fluttertoast.showToast(
msg: "曝光成功,AdnID:${data.adnID},RID:${data.rid}, ECPM:${data.ecpm}",
toastLength: Toast.LENGTH_SHORT);
}
}
if (defaultTargetPlatform == TargetPlatform.iOS) {
switch (data.method) {
case 'yfTopPushAdDidLoad':
Fluttertoast.showToast(
msg: "顶推广告加载成功", toastLength: Toast.LENGTH_SHORT);
break;
case 'yfTopPushAdLoadFail':
Fluttertoast.showToast(
msg: "顶推广告加载失败", toastLength: Toast.LENGTH_SHORT);
break;
case 'yfTopPushAdRenderSuccess':
Fluttertoast.showToast(
/// 顶推广告渲染成功,建议在此回调后展示
msg: "顶推广告渲染成功,建议在此回调后展示,AdnID:${data.adnID},RID:${data.rid}",
toastLength: Toast.LENGTH_SHORT);
break;
case 'yfTopPushAdRenderFail':
Fluttertoast.showToast(
msg: "顶推广告渲染失败", toastLength: Toast.LENGTH_SHORT);
break;
case 'yfTopPushAdDidExposure':
Fluttertoast.showToast(
msg: "顶推广告曝光", toastLength: Toast.LENGTH_SHORT);
break;
case 'yfTopPushAdDidClose':
Fluttertoast.showToast(
msg: "顶推广告关闭", toastLength: Toast.LENGTH_SHORT);
break;
case 'yfTopPushAdDetailPageClose':
Fluttertoast.showToast(
msg: "顶推广告落地页关闭", toastLength: Toast.LENGTH_SHORT);
break;
default:
Fluttertoast.showToast(
msg: "${data.method}", toastLength: Toast.LENGTH_SHORT);
break;
}
}
}
void splashAdCallBack(YFAdsCallBack data) {
print("splashAdCallBack:${data.method} ${data.tag}");
if (defaultTargetPlatform == TargetPlatform.android) {
if (data.method == YFAdsCallBack.YF_ADS_ANDROID_SUCCESS) {
Fluttertoast.showToast(
msg: "加载成功,AdnID:${data.adnID},RID:${data.rid}",
toastLength: Toast.LENGTH_SHORT);
} else if (data.method == YFAdsCallBack.YF_ADS_ANDROID_SHOW_SUCCESS) {
Fluttertoast.showToast(
msg: "曝光成功,AdnID:${data.adnID},RID:${data.rid}, ECPM:${data.ecpm}",
toastLength: Toast.LENGTH_SHORT);
}
}
if (defaultTargetPlatform == TargetPlatform.iOS) {
switch (data.method) {
case 'yfSplashAdDidLoad':
Fluttertoast.showToast(
msg: "开屏广告加载成功,AdnID:${data.adnID},RID:${data.rid}",
toastLength: Toast.LENGTH_SHORT);
break;
case 'yfSplashAdExpose':
{
if (Platform.isIOS) {
setState(() {
_pageAbsorbing = true;
});
}
Fluttertoast.showToast(
msg: "开屏广告曝光成功", toastLength: Toast.LENGTH_SHORT);
}
break;
case 'yfSplashAdLoadFail':
{
if (defaultTargetPlatform == TargetPlatform.iOS) {
setState(() {
_pageAbsorbing = false;
});
}
Fluttertoast.showToast(
msg: "开屏广告加载失败", toastLength: Toast.LENGTH_SHORT);
}
break;
case 'yfSplashAdDidClick':
Fluttertoast.showToast(
msg: "开屏广告点击", toastLength: Toast.LENGTH_SHORT);
break;
case 'yfSplashAdDidClose':
{
if (defaultTargetPlatform == TargetPlatform.iOS) {
setState(() {
_pageAbsorbing = false;
});
}
Fluttertoast.showToast(
msg: "开屏广告关闭", toastLength: Toast.LENGTH_SHORT);
}
break;
default:
}
}
}
Future<void> loadRewardVideoAd() async {
var reaperRewardVideoBean;
var positionId;
if (Platform.isAndroid) {
positionId = "e46b3594-f3db-4f8d-b602-ec429bb37fd2";
} else if (Platform.isIOS) {
positionId = "ea3c1722-1f76-4e06-85ed-47004a950201";
}
///object will send to your server to verify reward
///adCode means position id which will be replaced with real position id in reaper sdk,and should be fixed with %%POS_ID%%
///adSrc means ad source which will be replaced with real ad source in reaper sdk,and should be fixed with %%AD_SRC%%
///other parameters can be defined dynamic by yourself.
var reaperRewardVideoExtraBean = const YFAdsRewardVideoExtraBean(
uid: "1156642",
rewardVideoType: 2,
taskId: "70",
taskAction: "rewardVideo4energy",
version: "3.42.0_debug",
adCode: "%%POS_ID%%",
adSrc: "%%AD_SRC%%",
orientation: 1);
var extra = jsonEncode(reaperRewardVideoExtraBean);
reaperRewardVideoBean = YFAdsRewardVideoBean(
positionId: positionId,
loadAndShow: false,
extra: extra,
callBack: rewardVideoAdCallBack);
await YFRewardManager.loadRewardAd(reaperRewardVideoBean);
}
Future<void> showRewardVideoAd() async {
await YFRewardManager.showRewardAd();
}
void rewardVideoAdCallBack(YFAdsRewardVideoCallBack data) {
print("rewardVideoAdCallBack: ${data.method!}");
if (data.method == YFAdsRewardVideoCallBack.YF_ADS_ON_REWARD_VERIFY) {
print("rewardVideoAdCallBack "
"rewardName is ${data.rewardName},"
"rewardVerify is ${data.rewardVerify}");
}
if (defaultTargetPlatform == TargetPlatform.android) {
if (data.method == YFAdsCallBack.YF_ADS_ANDROID_SUCCESS) {
Fluttertoast.showToast(msg: "加载成功", toastLength: Toast.LENGTH_SHORT);
} else if (data.method == YFAdsCallBack.YF_ADS_REWARD_VIDEO_CACHE) {
Fluttertoast.showToast(
msg: "激励视频缓存成功,AdnID:${data.adnID},RID:${data.rid}",
toastLength: Toast.LENGTH_SHORT);
}
}
if (defaultTargetPlatform == TargetPlatform.iOS) {
switch (data.method) {
case 'yfRewardedVideoAdDidLoad':
Fluttertoast.showToast(
msg: "激励视频加载成功", toastLength: Toast.LENGTH_SHORT);
break;
case 'yfRewardedVideoAdDidLoad':
Fluttertoast.showToast(
msg: "激励视频缓存成功,AdnID:${data.adnID},RID:${data.rid}",
toastLength: Toast.LENGTH_SHORT);
break;
case 'yfRewardedVideoAdDidRewardEffective':
Fluttertoast.showToast(
msg: "激励视频到达激励时间", toastLength: Toast.LENGTH_SHORT);
break;
case 'yfRewardedVideoAdDidShow':
Fluttertoast.showToast(
msg: "激励视频曝光", toastLength: Toast.LENGTH_SHORT);
break;
case 'yfRewardedVideoAdDidClick':
Fluttertoast.showToast(
msg: "激励视频点击", toastLength: Toast.LENGTH_SHORT);
break;
case 'yfRewardedVideoAdLoadFail':
Fluttertoast.showToast(
msg: "激励视频加载失败", toastLength: Toast.LENGTH_SHORT);
break;
case 'yfRewardedVideoAdDidClose':
Fluttertoast.showToast(
msg: "激励视频关闭", toastLength: Toast.LENGTH_SHORT);
break;
case 'yfRewardedVideoAdDidPlayFinish':
Fluttertoast.showToast(
msg: "激励视频播放完成", toastLength: Toast.LENGTH_SHORT);
break;
default:
}
}
}
void showBannerView(BuildContext context) {
print("banner view button clicked");
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => YFAdsBannerViewDemo()),
);
}
void showBannerListView(BuildContext context) {
print("banner list view button clicked");
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => YFAdsBannerListViewDemo()),
);
}
void showFusionBannerView(BuildContext context) {
print("fusion banner view button clicked");
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => YFAdsFusionBannerViewDemo()),
);
}
void showFusionBannerListView(BuildContext context) {
print("fusion banner list view button clicked");
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => YFAdsFusionBannerListViewDemo()),
);
}
void showExpressFeedView(BuildContext context) {
print("express feed view button clicked");
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => YFAdsExpressFeedViewDemo()),
);
}
void showExpressFeedListView(BuildContext context) {
print("express feed list view button clicked");
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => ExpressFeedListViewDemo()),
);
}
void showNativeDrawFeedVideoView(BuildContext context) {
print("native draw feed video view button clicked");
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => YFAdsNativeDrawFeedVideoViewDemo()),
);
}
void showStreamView(BuildContext context) {
print("stream view button clicked");
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => YFAdsStreamViewDemo()),
);
}
Future<void> getPermission(BuildContext context) async {
var status = await Permission.notification.status;
print(status);
if (status == PermissionStatus.denied) {
await Permission.notification
.request()
.then((PermissionStatus permissionStatus) {
// 处理用户的选择
if (permissionStatus.isDenied) {
openAppSettings();
}
});
} else if (status == PermissionStatus.permanentlyDenied) {
openAppSettings();
} else if (status == PermissionStatus.granted) {
Fluttertoast.showToast(msg: "权限获取成功", toastLength: Toast.LENGTH_SHORT);
}
}
@override
Widget build(BuildContext context) {
Widget getAdSource() {
return Center(
child: SingleChildScrollView(
// physics: NeverScrollableScrollPhysics(), // 禁止滑动
physics: pagePhysics, // 允许滑动
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
// 添加SizedBox来留白
SizedBox(height: 10), // 这里可以调整留白的高度
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
ElevatedButton(
onPressed: onlyLoadSplashAd,
child: const Text("Load开屏广告"),
),
const SizedBox(width: 10), // 这里可以调整留白的高度
ElevatedButton(
onPressed: showSplashAd,
child: const Text("Show开屏广告"),
),
]),
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
ElevatedButton(
onPressed: loadInsertAd,
child: const Text("Load插屏广告"),
),
const SizedBox(width: 10), // 这里可以调整留白的高度
ElevatedButton(
onPressed: showInsertAd,
child: const Text("Show插屏广告"),
),
]),
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
ElevatedButton(
onPressed: loadTopPushAd,
child: const Text("Load顶推广告"),
),
const SizedBox(width: 10), // 这里可以调整留白的高度
ElevatedButton(
onPressed: showTopPushAd,
child: const Text("Show顶推广告"),
),
]),
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
ElevatedButton(
onPressed: loadRewardVideoAd,
child: const Text("Load激励视频广告"),
),
const SizedBox(width: 10), // 这里可以调整留白的高度
ElevatedButton(
onPressed: showRewardVideoAd,
child: const Text("Show激励视频广告"),
),
]),
ElevatedButton(
onPressed: () {
showFusionBannerView(context);
},
child: const Text("融合banner广告"),
),
ElevatedButton(
onPressed: () {
showFusionBannerListView(context);
},
child: const Text("融合banner流列表广告"),
),
ElevatedButton(
onPressed: () {
showNativeDrawFeedVideoView(context);
},
child: const Text("Draw视频广告"),
),
ElevatedButton(
onPressed: () {
showStreamView(context);
},
child: const Text("贴片广告"),
),
ElevatedButton(
onPressed: () {
getPermission(context);
},
child: const Text("获取通知栏权限"),
),
ElevatedButton(
onPressed: () {
showBannerView(context);
},
child: const Text("Banner广告(不再维护)"),
),
ElevatedButton(
onPressed: () {
showBannerListView(context);
},
child: const Text("Banner列表广告(不再维护)"),
),
ElevatedButton(
onPressed: () {
showExpressFeedView(context);
},
child: const Text("信息流广告(不再维护)"),
),
ElevatedButton(
onPressed: () {
showExpressFeedListView(context);
},
child: const Text("信息流列表广告(不再维护)"),
),
],
),
));
}
return MaterialApp(
home: Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text("YFAdsSDK插件"),
),
body: AbsorbPointer(
absorbing: _pageAbsorbing,
child: Center(
child: getAdSource(),
),
),
bottomNavigationBar: BottomNavigationBar(
fixedColor: Colors.red,
//选中的颜色
iconSize: 35,
//设置item的大小
type: BottomNavigationBarType.fixed,
//如果底部有4个或者4个以上,就必须设置该属性
currentIndex: _currentIndex,
//当前选中的是第几个菜单
onTap: (v) {
setState(() {
_currentIndex = v;
});
},
items: const [
BottomNavigationBarItem(icon: Icon(Icons.home), label: "首页"),
BottomNavigationBarItem(icon: Icon(Icons.category), label: "分类"),
BottomNavigationBarItem(icon: Icon(Icons.settings), label: "设置"),
]),
));
}
}