bjmob_sdk 0.0.4 copy "bjmob_sdk: ^0.0.4" to clipboard
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),
      ),
    );
  }
}
0
likes
135
points
16
downloads

Publisher

unverified uploader

Weekly Downloads

BJMOB SDK Flutter Plugin for Android and iOS.

Homepage

Documentation

API reference

License

GPL-3.0 (license)

Dependencies

flutter, plugin_platform_interface

More

Packages that depend on bjmob_sdk

Packages that implement bjmob_sdk