bjmob_sdk 0.0.2
bjmob_sdk: ^0.0.2 copied to clipboard
A new Flutter plugin.
好的,我来详细介绍一下广告加载和显示的完整调用流程:
- 初始化流程
// 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();
}
- 广告加载流程
// 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 = '广告加载失败';
});
},
// ... 其他回调
);
}
- 原生端处理流程
// 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()
}
- 广告控制流程
// 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('销毁广告'),
),
- 原生端控制处理
// 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)
}
完整调用链:
- Flutter 应用启动 ->
initState->_initSDK _initSDK初始化 SDK -> 等待就绪 -> 调用_loadBannerAd_loadBannerAd调用原生端loadBannerAd- 原生端创建广告容器和实例 -> 设置回调 -> 加载广告
- 广告加载成功后,通过
MethodChannel通知 Flutter 端 - Flutter 端更新 UI 状态,显示控制按钮
- 用户点击按钮,调用相应的控制方法
- 原生端执行对应的广告操作
- 操作结果通过
MethodChannel返回给 Flutter 端 - Flutter 端更新 UI 状态
这个流程确保了:
- 广告的正确加载和显示
- 状态的双向同步
- UI 的正确更新
- 资源的正确管理
- 错误的及时处理