bjmob_sdk 0.0.4
bjmob_sdk: ^0.0.4 copied to clipboard
BJMOB SDK Flutter Plugin for Android and iOS.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:bjmob_sdk/bjmob_sdk.dart';
import 'package:flutter/services.dart';
import 'pages/banner_ad_page.dart';
import 'pages/splash_ad_page.dart';
import 'pages/interstitial_ad_page.dart';
import 'pages/native_ad_page.dart';
import 'pages/reward_video_ad_page.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized(); // 确保Flutter绑定初始化
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String _platformVersion = 'Unknown';
String _adStatus = '未加载';
String _errorMessage = ''; // 添加错误信息状态
late BjmobSdk _bjmobSdkPlugin;
bool _showSplashAd = false; // 控制开屏广告显示状态
StreamSubscription<AdEvent>? _adEventSubscription;
int? _nativeExpressContainerId;
String? _gaid;
@override
void initState() {
super.initState();
_bjmobSdkPlugin = BjmobSdk();
_initializeApp();
_listenAdEvents();
_loadGAID();
}
@override
void dispose() {
_adEventSubscription?.cancel();
super.dispose();
}
Future<void> _initializeApp() async {
try {
// 初始化SDK
await _initializeSdk();
// 获取平台版本
await _getPlatformVersion();
} catch (e) {
print('初始化失败: $e');
setState(() {
_errorMessage = '初始化失败: $e';
});
}
}
Future<void> _initializeSdk() async {
try {
setState(() {
_adStatus = '正在初始化SDK...';
});
await _bjmobSdkPlugin.initialize(appId: 'd6d617c2bd9f2e00');
print('SDK初始化成功');
setState(() {
_adStatus = 'SDK初始化成功';
});
} catch (e) {
print('SDK初始化失败: $e');
setState(() {
_adStatus = 'SDK初始化失败';
_errorMessage = e.toString();
});
}
}
// 监听广告事件
void _listenAdEvents() {
_adEventSubscription = _bjmobSdkPlugin.adEventStream.listen(
(event) {
if (event == null) return;
print('收到广告事件: ${event.type} - ${event.action}');
// 先处理开屏广告关闭事件,确保 UI 更新优先级
if (event.type == 'splash' &&
(event.action == 'close' || event.action == 'skip')) {
print('开屏广告关闭,准备返回首页');
setState(() {
_showSplashAd = false;
});
return; // 直接返回,不处理其他状态更新
}
setState(() {
_adStatus = '${event.type} - ${event.action}';
_errorMessage = '';
// 处理失败事件
if (event.action == 'failed' || event.action == 'error') {
if (event.data != null && event.data!.isNotEmpty) {
_errorMessage = '错误: ${event.data!.join(' - ')}';
_showSplashAd = false; // 失败时关闭开屏广告
print('广告失败,关闭开屏广告');
}
}
});
},
onError: (error) {
print('广告事件流错误: $error');
setState(() {
_errorMessage = '事件流错误: $error';
_showSplashAd = false; // 错误时关闭开屏广告
print('事件流错误,关闭开屏广告');
});
},
);
}
// 加载Banner广告
void _loadBannerAd() async {
try {
setState(() {
_adStatus = '正在加载Banner广告...';
});
print('开始请求Banner广告');
await _bjmobSdkPlugin.loadBanner('banner_container');
print('Banner广告请求已发送');
setState(() {
_adStatus = 'Banner广告加载请求已发送';
});
} catch (e, stack) {
print('加载Banner广告失败: $e');
print('堆栈: $stack');
setState(() {
_adStatus = '加载Banner广告失败: $e';
});
}
}
// 加载开屏广告
void _loadSplashAd() async {
try {
setState(() {
_adStatus = '正在加载开屏广告...';
_showSplashAd = true;
});
await _bjmobSdkPlugin.loadSplash(
adContainer: 'splash_container',
logoContainer: 'logo_container',
singleActivity: true,
);
setState(() {
_adStatus = '开屏广告加载请求已发送';
});
} catch (e) {
setState(() {
_adStatus = '加载开屏广告失败: $e';
_showSplashAd = false;
});
}
}
// 加载插屏广告
void _loadInterstitialAd() async {
try {
setState(() {
_adStatus = '正在加载插屏广告...';
});
await _bjmobSdkPlugin.loadInterstitial();
setState(() {
_adStatus = '插屏广告加载请求已发送';
});
} catch (e) {
setState(() {
_adStatus = '加载插屏广告失败: $e';
});
}
}
// 展示插屏广告
void _showInterstitialAd() async {
try {
setState(() {
_adStatus = '正在展示插屏广告...';
});
await _bjmobSdkPlugin.showInterstitial();
setState(() {
_adStatus = '插屏广告展示请求已发送';
});
} catch (e) {
setState(() {
_adStatus = '展示插屏广告失败: $e';
});
}
}
// 加载激励视频广告
void _loadRewardVideoAd() async {
try {
setState(() {
_adStatus = '正在加载激励视频广告...';
});
await _bjmobSdkPlugin.loadRewardVideo();
setState(() {
_adStatus = '激励视频广告加载请求已发送';
});
} catch (e) {
setState(() {
_adStatus = '加载激励视频广告失败: $e';
});
}
}
// 展示激励视频广告
void _showRewardVideoAd() async {
try {
setState(() {
_adStatus = '正在展示激励视频广告...';
});
await _bjmobSdkPlugin.showRewardVideo();
setState(() {
_adStatus = '激励视频广告展示请求已发送';
});
} catch (e) {
setState(() {
_adStatus = '展示激励视频广告失败: $e';
});
}
}
// 加载并展示原生广告
void _loadNativeExpressAd() async {
try {
setState(() {
_adStatus = '正在加载原生广告...';
});
if (_nativeExpressContainerId == null) {
throw Exception('广告容器未准备好');
}
await _bjmobSdkPlugin
.loadNativeExpress(_nativeExpressContainerId.toString());
setState(() {
_adStatus = '原生广告加载请求已发送';
});
} catch (e) {
setState(() {
_adStatus = '加载原生广告失败: $e';
});
}
}
Future<void> _getPlatformVersion() async {
String platformVersion;
try {
platformVersion = await _bjmobSdkPlugin.getPlatformVersion() ??
'Unknown platform version';
} catch (e) {
platformVersion = 'Failed to get platform version.';
}
if (!mounted) return;
setState(() {
_platformVersion = platformVersion;
});
}
Future<void> _loadGAID() async {
try {
_gaid = await _bjmobSdkPlugin.getGAID();
} catch (e) {
print('加载GAID失败: $e');
}
}
void _handleCopyGAID(BuildContext context) async {
if (_gaid == null) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('GAID 未获取到')),
);
return;
}
await Clipboard.setData(ClipboardData(text: _gaid!));
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('GAID 已复制到剪贴板')),
);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Builder(
builder: (context) => HomeScreen(
platformVersion: _platformVersion,
adStatus: _adStatus,
errorMessage: _errorMessage,
onCopyGAID: () => _handleCopyGAID(context),
gaid: _gaid,
),
),
);
}
}
class HomeScreen extends StatelessWidget {
final String platformVersion;
final String adStatus;
final String errorMessage;
final VoidCallback onCopyGAID;
final String? gaid;
const HomeScreen({
Key? key,
required this.platformVersion,
required this.adStatus,
required this.errorMessage,
required this.onCopyGAID,
this.gaid,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Bjmob SDK 示例'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
// 状态显示
Text('平台版本: $platformVersion'),
const SizedBox(height: 16),
Text('广告状态: $adStatus'),
if (errorMessage.isNotEmpty)
Padding(
padding: const EdgeInsets.only(top: 8.0),
child: Text(
errorMessage,
style: const TextStyle(color: Colors.red),
),
),
const SizedBox(height: 32),
// 广告按钮
_buildNavigationButton(
context,
'横幅广告 (Banner)',
const BannerAdPage(),
),
const SizedBox(height: 16),
_buildNavigationButton(
context,
'开屏广告 (Splash)',
const SplashAdPage(),
),
const SizedBox(height: 16),
_buildNavigationButton(
context,
'插屏广告 (Interstitial)',
const InterstitialAdPage(),
),
const SizedBox(height: 16),
_buildNavigationButton(
context,
'原生广告 (Native)',
const NativeAdPage(),
),
const SizedBox(height: 16),
_buildNavigationButton(
context,
'激励视频 (Rewarded Video)',
const RewardVideoAdPage(),
),
// 底部复制GAID按钮
const SizedBox(height: 32),
Container(
padding: const EdgeInsets.only(bottom: 16),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
'GAID: ${gaid ?? '获取中...'}',
style: TextStyle(
fontSize: 12,
color: Colors.grey[600],
),
textAlign: TextAlign.center,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
const SizedBox(height: 8),
ElevatedButton(
onPressed: gaid == null ? null : onCopyGAID,
style: ElevatedButton.styleFrom(
padding: const EdgeInsets.symmetric(
vertical: 12,
horizontal: 24,
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
const Icon(Icons.copy, size: 18),
const SizedBox(width: 8),
const Text(
'复制 GAID',
style: TextStyle(fontSize: 16),
),
],
),
),
],
),
),
],
),
),
),
);
}
Widget _buildNavigationButton(BuildContext context, String title, Widget page) {
return ElevatedButton(
onPressed: () {
print("$title 按钮被点击"); // 调试输出
Navigator.push(
context,
MaterialPageRoute(builder: (context) => page),
);
},
style: ElevatedButton.styleFrom(
padding: const EdgeInsets.symmetric(vertical: 16),
minimumSize: const Size.fromHeight(50),
),
child: Text(
title,
style: const TextStyle(fontSize: 16),
),
);
}
}