bjmob_sdk 0.0.2 copy "bjmob_sdk: ^0.0.2" to clipboard
bjmob_sdk: ^0.0.2 copied to clipboard

A new Flutter plugin.

好的,我来详细介绍一下广告加载和显示的完整调用流程:

  1. 初始化流程
// Flutter 端 (main.dart)
void initState() {
  super.initState();
  _initSDK();  // 初始化 SDK
}

Future<void> _initSDK() async {
  // 1. 调用原生端初始化
  await BjmobFlutterPlugin.init(appId: '69lSe9cvORWnd62o');
  
  // 2. 等待 SDK 就绪
  await Future.delayed(const Duration(seconds: 3));
  
  // 3. 开始加载广告
  await _loadBannerAd();
}
  1. 广告加载流程
// Flutter 端 (main.dart)
Future<void> _loadBannerAd() async {
  // 1. 设置加载状态
  setState(() {
    _isLoading = true;
    _adStatus = '正在加载广告...';
    _isAdLoaded = false;
  });
  
  // 2. 调用原生端加载广告
  await BjmobFlutterPlugin.loadBannerAd(
    width: 320,
    height: 50,
    // 3. 设置回调函数
    onAdLoaded: (info) {
      setState(() {
        _isAdLoaded = true;
        _isLoading = false;
        _adStatus = '广告加载成功';
      });
    },
    onAdFailedToLoad: (error) {
      setState(() {
        _isAdLoaded = false;
        _isLoading = false;
        _adStatus = '广告加载失败';
      });
    },
    // ... 其他回调
  );
}
  1. 原生端处理流程
// Android 端 (BjmobFlutterPlugin.kt)
private fun loadBannerAd(activity: Activity, adUnitId: String, result: MethodChannel.Result) {
  // 1. 检查加载状态
  if (isAdLoading) {
    result.error("ALREADY_LOADING", "Banner ad is already loading", null)
    return
  }

  // 2. 创建广告容器
  bannerContainer = FrameLayout(activity)
  val params = FrameLayout.LayoutParams(
    FrameLayout.LayoutParams.MATCH_PARENT,
    FrameLayout.LayoutParams.WRAP_CONTENT
  )
  params.gravity = Gravity.BOTTOM
  activity.addContentView(bannerContainer, params)

  // 3. 创建广告实例
  bannerAd = BJAdBanner(activity, bannerContainer, object : EABannerListener {
    // 4. 设置广告回调
    override fun onAdSucceed() {
      // 5. 通知 Flutter 端加载成功
      activity.runOnUiThread {
        isAdLoading = false
        isAdLoaded = true
        channel.invokeMethod("onAdLoaded", mapOf(
          "event" to "onAdLoaded",
          "adType" to "banner"
        ))
        result.success(null)
      }
    }
    // ... 其他回调
  })

  // 6. 设置广告尺寸
  val screenWidth = ScreenUtil.getScreenWidth(activity)
  val adWidth = screenWidth
  val adHeight = (adWidth * 100 / 640).toInt()
  bannerAd?.setCsjExpressSize(adWidth, adHeight)

  // 7. 设置广告数据
  bannerAd?.setData(BJAdsConfigFileManager.getInstance().getAdsConfig(activity, BJConfig.BJAdsType_Banner))

  // 8. 加载并显示广告
  bannerAd?.loadAndShow()
}
  1. 广告控制流程
// Flutter 端 (main.dart)
// 显示广告
ElevatedButton(
  onPressed: () async {
    await BjmobFlutterPlugin.showBannerAd();
    setState(() {
      _adStatus = '广告已显示';
    });
  },
  child: const Text('显示广告'),
),

// 隐藏广告
ElevatedButton(
  onPressed: () async {
    await BjmobFlutterPlugin.hideBannerAd();
    setState(() {
      _adStatus = '广告已隐藏';
    });
  },
  child: const Text('隐藏广告'),
),

// 销毁广告
ElevatedButton(
  onPressed: () async {
    await BjmobFlutterPlugin.destroyBannerAd();
    setState(() {
      _isAdLoaded = false;
      _adStatus = '广告已销毁';
    });
  },
  child: const Text('销毁广告'),
),
  1. 原生端控制处理
// Android 端 (BjmobFlutterPlugin.kt)
// 显示广告
private fun showBannerAd(result: Result) {
  bannerAd?.show()
  result.success(null)
}

// 隐藏广告
private fun hideBannerAd(result: Result) {
  bannerAd?.hide()
  result.success(null)
}

// 销毁广告
private fun destroyBannerAd(result: Result) {
  bannerAd?.destroy()
  bannerAd = null
  bannerContainer = null
  isAdLoaded = false
  result.success(null)
}

完整调用链

  1. Flutter 应用启动 -> initState -> _initSDK
  2. _initSDK 初始化 SDK -> 等待就绪 -> 调用 _loadBannerAd
  3. _loadBannerAd 调用原生端 loadBannerAd
  4. 原生端创建广告容器和实例 -> 设置回调 -> 加载广告
  5. 广告加载成功后,通过 MethodChannel 通知 Flutter 端
  6. Flutter 端更新 UI 状态,显示控制按钮
  7. 用户点击按钮,调用相应的控制方法
  8. 原生端执行对应的广告操作
  9. 操作结果通过 MethodChannel 返回给 Flutter 端
  10. Flutter 端更新 UI 状态

这个流程确保了:

  • 广告的正确加载和显示
  • 状态的双向同步
  • UI 的正确更新
  • 资源的正确管理
  • 错误的及时处理
0
likes
0
points
15
downloads

Publisher

unverified uploader

Weekly Downloads

A new Flutter plugin.

Homepage

License

unknown (license)

Dependencies

flutter, plugin_platform_interface

More

Packages that depend on bjmob_sdk

Packages that implement bjmob_sdk