pdavenue_ads_monetize 1.0.6
pdavenue_ads_monetize: ^1.0.6 copied to clipboard
A Flutter plugin bridging the native Android Ads Monetize SDK to display standard (interstitial/rewarded), video, app open, native, and banner ads.
example/lib/main.dart
// ignore_for_file: deprecated_member_use
import 'package:flutter/material.dart';
import 'package:pdavenue_ads_monetize/pdavenue_ads_monetize.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Monetize Ads & Toast SDK Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
brightness: Brightness.dark,
scaffoldBackgroundColor: const Color(0xFF0D0E15),
cardTheme: CardThemeData(
color: const Color(0xFF161824),
elevation: 4,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16),
side: const BorderSide(color: Color(0xFF282B3E), width: 1),
),
),
colorScheme: const ColorScheme.dark(
primary: Color(0xFF8B5CF6),
secondary: Color(0xFF10B981),
surface: Color(0xFF161824),
error: Color(0xFFEF4444),
),
useMaterial3: true,
),
home: const AdsDemoHomeScreen(),
);
}
}
class AdsDemoHomeScreen extends StatefulWidget {
const AdsDemoHomeScreen({super.key});
@override
State<AdsDemoHomeScreen> createState() => _AdsDemoHomeScreenState();
}
class _AdsDemoHomeScreenState extends State<AdsDemoHomeScreen> {
// SDK Configuration States
bool _isSdkInitialized = false;
String _sdkStatus = "Not Initialized";
final TextEditingController _appIdController = TextEditingController(
text: "4i2udfqa",
);
// App Open Ads State
bool _appOpenBlocked = false;
// Custom Toast States
final TextEditingController _toastMsgController = TextEditingController(
text: "Greetings from pdavenue_ads_monetize!",
);
bool _isToastLong = false;
// Static color specifications (no dropdowns, statically assigned colors)
final String _toastBgColor = "#FF8B5CF6";
final String _toastTextColor = "#FFFFFFFF";
final String _nativeAdBgColor = "#FF161824";
final String _nativeAdTitleColor = "#FFFFFFFF";
final String _nativeAdButtonBgColor = "#FF8B5CF6";
final String _nativeAdButtonTextColor = "#FFFFFFFF";
final String _loaderBgColor = "#FF0D0E15";
final String _loaderTextColor = "#FFFFFFFF";
final String _loaderColor = "#FF8B5CF6";
// Logbook for tracking actions
final List<String> _logs = [];
final ScrollController _logScrollController = ScrollController();
@override
void initState() {
super.initState();
// Pre-apply styles on startup statically
_applyNativeUiStyle();
_applyLoaderUiStyle();
}
void _log(String message) {
final timestamp = DateTime.now().toString().substring(11, 19);
setState(() {
_logs.add("[$timestamp] $message");
});
// Auto-scroll to bottom of console
WidgetsBinding.instance.addPostFrameCallback((_) {
if (_logScrollController.hasClients) {
_logScrollController.jumpTo(
_logScrollController.position.maxScrollExtent,
);
}
});
}
Future<void> _checkInitStatus() async {
try {
final init = await AdsSdk.isAdsInitialized();
setState(() {
_isSdkInitialized = init;
_sdkStatus = init ? "Initialized (Active)" : "Not Initialized";
});
_log("Checked SDK state. Initialized: $init");
} catch (e) {
_log("Error checking init status: $e");
}
}
Future<void> _initializeSdk() async {
setState(() {
_sdkStatus = "Initializing...";
});
_log("Starting SDK initialization...");
try {
final result = await AdsSdk.adsInitialize(
appId: _appIdController.text,
isDebugOn: false,
);
setState(() {
_isSdkInitialized = true;
_sdkStatus = "Initialized: $result";
});
_log("SDK Initialize result: $result");
_log("Pre-loading ads priority list...");
await AdsManager.initAds(isShowAds: "5", adsPriority: "1,2,3");
_log("Pre-load trigger sent (isShowAds: 5, priority: 1,2,3)");
} catch (e) {
setState(() {
_isSdkInitialized = false;
_sdkStatus = "Error: $e";
});
_log("SDK Initialization crashed: $e");
}
}
void _triggerShowAd(String type, String name) {
_log("Triggering showAds: type=$type ($name)");
try {
AdsManager.showAds(
isShowAds: type,
eventName: "DEMO_${name.toUpperCase()}_CLICK",
);
_log("ShowAd command dispatched for $name");
} catch (e) {
_log("Failed to show standard ad: $e");
}
}
Future<void> _triggerVideoAd(String type, String name) async {
_log("Triggering showVideoAds: type=$type ($name)");
try {
final shown = await AdsManager.showVideoAds(
isShowAds: type,
eventName: "DEMO_${name.toUpperCase()}_CLICK",
);
_log("Video ad callback completed. Ad shown state: $shown");
} catch (e) {
_log("Failed to show video ad: $e");
}
}
Future<void> _applyNativeUiStyle() async {
_log("Applying Native UI custom styling...");
try {
await AdsSdk.setNativeUI(
NativeUI(
nativeBackgroundColor: _nativeAdBgColor,
nativeTitleTextColor: _nativeAdTitleColor,
nativeButtonBackgroundColor: _nativeAdButtonBgColor,
nativeButtonTextColor: _nativeAdButtonTextColor,
nativeBackgroundStrokeColor: "#FFFF0000",
nativeBackgroundStrokeWidth: 1,
nativeBackgroundRadius: 12.0,
nativeIconRadius: 8.0,
nativeAdTagColor: "#FF10B981",
nativeAdTagTextColor: "#FFFFFFFF",
nativeBodyTextColor: "#FF9CA3AF",
nativeButtonTextSize: 14.0,
shimmerBackgroundColor: "#FF161824",
shimmerDarkColor: "#FF232538",
),
);
_log("Native UI style applied successfully!");
} catch (e) {
_log("Failed to apply Native UI style: $e");
}
}
Future<void> _applyLoaderUiStyle() async {
_log("Applying Loader UI custom branding...");
try {
await AdsSdk.setLoaderUI(
LoaderUI(
background: _loaderBgColor,
textColor: _loaderTextColor,
loaderColor: _loaderColor,
cornerRadius: 12.0,
),
);
_log("Loader UI style applied successfully!");
} catch (e) {
_log("Failed to apply Loader UI style: $e");
}
}
void _triggerNativeToast() {
final msg = _toastMsgController.text;
_log("Triggering custom toast: '$msg'");
// Parse hex colors for simulation
Color bg = const Color(0xFF8B5CF6);
try {
bg = Color(int.parse(_toastBgColor.replaceAll('#', '0x')));
} catch (_) {}
Color txt = Colors.white;
try {
txt = Color(int.parse(_toastTextColor.replaceAll('#', '0x')));
} catch (_) {}
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
msg,
style: TextStyle(color: txt, fontWeight: FontWeight.bold),
),
backgroundColor: bg,
duration: _isToastLong
? const Duration(seconds: 4)
: const Duration(seconds: 2),
behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
),
);
_log("Toast simulation displayed successfully (API absent in v1.0.0)");
}
@override
void dispose() {
_appIdController.dispose();
_toastMsgController.dispose();
_logScrollController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Row(
children: [
Icon(Icons.monetization_on, color: Color(0xFF10B981)),
SizedBox(width: 10),
Text(
'Ads & Toast Monetize',
style: TextStyle(fontWeight: FontWeight.bold, letterSpacing: 0.8),
),
],
),
backgroundColor: const Color(0xFF161824),
actions: [
IconButton(
icon: const Icon(Icons.refresh),
onPressed: () {
_checkInitStatus();
_log("Status manually refreshed");
},
tooltip: "Refresh Status",
),
IconButton(
icon: const Icon(Icons.delete_sweep_outlined),
onPressed: () {
setState(() {
_logs.clear();
});
},
tooltip: "Clear Logs",
),
],
),
body: SingleChildScrollView(
physics: const BouncingScrollPhysics(),
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
// SDK Configuration Card
_buildSdkConfigCard(),
const SizedBox(height: 16),
// Ad Controls Card
_buildAdsControlCard(),
const SizedBox(height: 16),
// App Open Ad Controls Card
_buildAppOpenCard(),
const SizedBox(height: 16),
// Custom Toast Message Card
_buildToastCard(),
const SizedBox(height: 16),
// Log Console Card
_buildConsoleCard(),
const SizedBox(height: 16),
// Embedded Native Ad Widget Demo
_buildEmbeddedNativeAdCard(),
const SizedBox(height: 16),
// Embedded Banner Ad Widget Demo
_buildEmbeddedBannerAdCard(),
const SizedBox(height: 80),
// extra padding for bottom banner anchor
],
),
),
bottomSheet: _buildBottomBannerWidget(),
);
}
Widget _buildSdkConfigCard() {
return Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
"SDK Config",
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: Colors.white70,
),
),
Container(
padding: const EdgeInsets.symmetric(
horizontal: 10,
vertical: 4,
),
decoration: BoxDecoration(
color: _isSdkInitialized
? const Color(0xFF10B981).withOpacity(0.15)
: const Color(0xFFF59E0B).withOpacity(0.15),
borderRadius: BorderRadius.circular(20),
border: Border.all(
color: _isSdkInitialized
? const Color(0xFF10B981)
: const Color(0xFFF59E0B),
width: 1,
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(
_isSdkInitialized
? Icons.check_circle
: Icons.warning_rounded,
color: _isSdkInitialized
? const Color(0xFF10B981)
: const Color(0xFFF59E0B),
size: 14,
),
const SizedBox(width: 5),
Text(
_isSdkInitialized ? "Online" : "Offline",
style: TextStyle(
color: _isSdkInitialized
? const Color(0xFF10B981)
: const Color(0xFFF59E0B),
fontWeight: FontWeight.bold,
fontSize: 12,
),
),
],
),
),
],
),
const Divider(color: Color(0xFF282B3E), height: 24),
TextField(
controller: _appIdController,
decoration: const InputDecoration(
labelText: 'Google AdMob App ID',
labelStyle: TextStyle(color: Colors.white60),
border: OutlineInputBorder(),
prefixIcon: Icon(Icons.vpn_key_outlined),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: Color(0xFF8B5CF6), width: 2),
),
),
),
const SizedBox(height: 12),
Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
"Status Message",
style: TextStyle(color: Colors.white38, fontSize: 12),
),
const SizedBox(height: 2),
Text(
_sdkStatus,
style: TextStyle(
fontWeight: FontWeight.bold,
color: _isSdkInitialized
? const Color(0xFF10B981)
: const Color(0xFFEF4444),
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
],
),
),
const SizedBox(width: 12),
ElevatedButton.icon(
onPressed: _initializeSdk,
icon: const Icon(Icons.rocket_launch, size: 18),
label: const Text("Initialize"),
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF8B5CF6),
foregroundColor: Colors.white,
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 12,
),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
),
),
],
),
],
),
),
);
}
Widget _buildAdsControlCard() {
return Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
"Trigger Ad Unit formats",
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: Colors.white70,
),
),
const Divider(color: Color(0xFF282B3E), height: 24),
const Text(
"Standard Ads (AdsManager.showAds)",
style: TextStyle(
fontWeight: FontWeight.w600,
color: Colors.white54,
fontSize: 13,
),
),
const SizedBox(height: 8),
GridView.count(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
crossAxisCount: 2,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
childAspectRatio: 2.8,
children: [
_buildAdButton(
"Interstitial (1)",
() => _triggerShowAd("1", "Interstitial"),
),
_buildAdButton(
"Rewarded (2)",
() => _triggerShowAd("2", "Rewarded"),
),
_buildAdButton(
"Redirect (3)",
() => _triggerShowAd("3", "Redirect"),
),
_buildAdButton(
"Full Native (4)",
() => _triggerShowAd("4", "Full Native"),
),
],
),
const SizedBox(height: 16),
const Text(
"Video Ads (AdsManager.showVideoAds)",
style: TextStyle(
fontWeight: FontWeight.w600,
color: Colors.white54,
fontSize: 13,
),
),
const SizedBox(height: 8),
Row(
children: [
Expanded(
child: _buildAdButton(
"Video Inter (1)",
() => _triggerVideoAd("1", "Video Inter"),
icon: Icons.video_collection_outlined,
),
),
const SizedBox(width: 10),
Expanded(
child: _buildAdButton(
"Video Reward (2)",
() => _triggerVideoAd("2", "Video Reward"),
icon: Icons.video_library_outlined,
),
),
],
),
],
),
),
);
}
Widget _buildAdButton(
String label,
VoidCallback onPressed, {
IconData icon = Icons.ads_click,
}) {
return ElevatedButton.icon(
onPressed: _isSdkInitialized ? onPressed : null,
icon: Icon(icon, size: 16),
label: Text(
label,
style: const TextStyle(fontSize: 12, fontWeight: FontWeight.bold),
),
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF232538),
foregroundColor: Colors.white,
disabledBackgroundColor: const Color(0xFF161824).withOpacity(0.5),
disabledForegroundColor: Colors.white30,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
side: BorderSide(
color: _isSdkInitialized
? const Color(0xFF3B3E5B)
: Colors.transparent,
width: 1,
),
),
padding: const EdgeInsets.symmetric(horizontal: 12),
),
);
}
Widget _buildAppOpenCard() {
return Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
"App Open Ads Control",
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: Colors.white70,
),
),
const Divider(color: Color(0xFF282B3E), height: 24),
SwitchListTile(
contentPadding: EdgeInsets.zero,
title: const Text('Block App Open Ads'),
subtitle: const Text(
'Blocks the automatic overlay when app is resumed',
),
value: _appOpenBlocked,
activeColor: const Color(0xFF8B5CF6),
onChanged: _isSdkInitialized
? (bool value) {
setState(() {
_appOpenBlocked = value;
});
if (value) {
AdsManager.blockAppOpen();
_log("App Open block requested (blockAppOpen)");
} else {
AdsManager.allowAppOpen();
_log("App Open block released (allowAppOpen)");
}
}
: null,
),
const SizedBox(height: 12),
Center(
child: SizedBox(
width: double.infinity,
child: ElevatedButton.icon(
onPressed: _isSdkInitialized
? () {
_log("Forcing manual App Open display...");
AdsManager.showAppOpen();
}
: null,
icon: const Icon(Icons.flip_to_front_outlined),
label: const Text("Force Display App Open"),
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF2E1C59),
foregroundColor: Colors.white,
disabledBackgroundColor: const Color(
0xFF161824,
).withOpacity(0.5),
disabledForegroundColor: Colors.white30,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
side: BorderSide(
color: _isSdkInitialized
? const Color(0xFF5D3EBB)
: Colors.transparent,
),
),
padding: const EdgeInsets.symmetric(vertical: 12),
),
),
),
),
],
),
),
);
}
Widget _buildToastCard() {
return Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
"Native Toast Customizer",
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: Colors.white70,
),
),
const Divider(color: Color(0xFF282B3E), height: 24),
TextField(
controller: _toastMsgController,
decoration: const InputDecoration(
labelText: 'Toast Message',
labelStyle: TextStyle(color: Colors.white60),
border: OutlineInputBorder(),
prefixIcon: Icon(Icons.short_text_outlined),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: Color(0xFF8B5CF6), width: 2),
),
),
),
const SizedBox(height: 12),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
const Text("Long Duration:"),
Switch(
value: _isToastLong,
activeColor: const Color(0xFF8B5CF6),
onChanged: (val) {
setState(() {
_isToastLong = val;
});
},
),
],
),
ElevatedButton.icon(
onPressed: _triggerNativeToast,
icon: const Icon(Icons.chat_bubble_outline),
label: const Text("Show Toast"),
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF10B981),
foregroundColor: Colors.white,
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 12,
),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
),
),
],
),
],
),
),
);
}
Widget _buildConsoleCard() {
return Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"Event Log Console",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: Colors.white70,
),
),
Icon(Icons.terminal_outlined, color: Colors.white30, size: 18),
],
),
const SizedBox(height: 10),
Container(
height: 140,
width: double.infinity,
padding: const EdgeInsets.all(10),
decoration: BoxDecoration(
color: const Color(0xFF090A10),
borderRadius: BorderRadius.circular(8),
border: Border.all(color: const Color(0xFF282B3E)),
),
child: _logs.isEmpty
? const Center(
child: Text(
"Console empty. Trigger actions to see callback logs.",
style: TextStyle(color: Colors.white24, fontSize: 12),
),
)
: ListView.builder(
controller: _logScrollController,
itemCount: _logs.length,
physics: const ClampingScrollPhysics(),
itemBuilder: (context, idx) {
return Padding(
padding: const EdgeInsets.only(bottom: 4.0),
child: Text(
_logs[idx],
style: TextStyle(
fontFamily: 'Courier',
fontSize: 11,
color:
_logs[idx].contains("crashed") ||
_logs[idx].contains("Error")
? Colors.redAccent
: _logs[idx].contains("successfully") ||
_logs[idx].contains("Online")
? Colors.greenAccent
: Colors.white70,
),
),
);
},
),
),
],
),
),
);
}
Widget _buildEmbeddedNativeAdCard() {
return Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
"Embedded Native Ad (Big Type)",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: Colors.white70,
),
),
const Divider(color: Color(0xFF282B3E), height: 24),
if (!_isSdkInitialized)
const Center(
child: Padding(
padding: EdgeInsets.symmetric(vertical: 24.0),
child: Text(
"SDK not initialized. Initialize the SDK to load embedded Native ad.",
style: TextStyle(
color: Colors.white24,
fontStyle: FontStyle.italic,
fontSize: 13,
),
textAlign: TextAlign.center,
),
),
)
else
Container(
height: 320,
decoration: BoxDecoration(
color: const Color(0xFF0F101A),
borderRadius: BorderRadius.circular(12),
border: Border.all(color: const Color(0xFF1E2235)),
),
child: const ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(12)),
child: MonetizeNativeAd(
eventName: "DEMO_DASHBOARD_NATIVE",
type: NativeAdsType.BIG,
),
),
),
],
),
),
);
}
Widget _buildEmbeddedBannerAdCard() {
return Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
"Embedded Banner Ad (Adaptive Type)",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: Colors.white70,
),
),
const Divider(color: Color(0xFF282B3E), height: 24),
if (!_isSdkInitialized)
const Center(
child: Padding(
padding: EdgeInsets.symmetric(vertical: 16.0),
child: Text(
"SDK not initialized. Initialize the SDK to load banner ad.",
style: TextStyle(
color: Colors.white24,
fontStyle: FontStyle.italic,
fontSize: 13,
),
textAlign: TextAlign.center,
),
),
)
else
Container(
height: 60,
decoration: BoxDecoration(
color: const Color(0xFF0F101A),
borderRadius: BorderRadius.circular(8),
border: Border.all(color: const Color(0xFF1E2235)),
),
child: const Center(
child: MonetizeBannerAd(
eventName: "DEMO_DASHBOARD_BANNER",
bannerType: BannerType.ADAPTIVE,
),
),
),
],
),
),
);
}
Widget? _buildBottomBannerWidget() {
if (!_isSdkInitialized) return null;
return Container(
color: const Color(0xFF161824),
height: 60,
width: double.infinity,
alignment: Alignment.center,
child: const MonetizeBannerAd(
eventName: "DEMO_ANCHORED_BANNER",
bannerType: BannerType.ADAPTIVE,
),
);
}
}