Flutter集成Unity Ads遇UnityAdsLoadError.invalidArgument等问题求助
解决Flutter集成Unity Ads无法展示的问题
错误核心分析
从日志可定位两个关键问题:
UnityAdsBannerError.noFill:目标广告位无可用广告填充(测试模式下多为配置或调用逻辑问题)adMarkup is missing; objectId is missing:广告加载调用不符合SDK规范,尤其是Banner广告的手动加载逻辑错误
具体修复步骤
1. 移除Banner广告的手动load调用
Unity Ads的UnityBannerAd组件会自动完成加载与展示流程,手动调用UnityAds.load()会触发无效参数错误。直接删除Load_Banner_Ads()方法,同时移除初始化完成后对该方法的调用。
2. 修正Interstitial广告的加载与展示逻辑
- 确保Unity后台的
Interstitial_Android广告位已启用,测试阶段可优先使用官方测试广告位ID(需确认后台配置对应) - 避免初始化完成后立即调用加载方法,可延迟几秒或在需要展示前提前触发加载,防止SDK未完全就绪导致的异常
- 展示前先检查广告是否加载完成,避免调用未就绪的广告
3. 优化类成员变量的使用
将非静态的iscorrect_platform改为静态getter,避免静态方法中重复创建实例:
static bool get isCorrectPlatform => Platform.isAndroid || Platform.isIOS;
修复后的完整代码示例
import 'dart:io'; import 'package:flutter/material.dart'; import 'package:unity_ads_plugin/unity_ads_plugin.dart'; class Ads { static bool get isCorrectPlatform => Platform.isAndroid || Platform.isIOS; static init() async { if (isCorrectPlatform) { await UnityAds.init( gameId: 'XXXXXXXX', testMode: true, onComplete: () { print('Initialization Complete'); LoadInterstitialAds(); }, onFailed: (error, message) => print('Initialization Failed: $error $message'), ); } } static Widget showBannerAds() { if (isCorrectPlatform) { return UnityBannerAd( placementId: 'Banner_Android', onLoad: (placementId) => print('Banner loaded: $placementId'), onClick: (placementId) => print('Banner clicked: $placementId'), onShown: (placementId) => print('Banner shown: $placementId'), onFailed: (placementId, error, message) => print('Banner Ad $placementId failed: $error $message'), ); } return const SizedBox.shrink(); } static LoadInterstitialAds() async { if (isCorrectPlatform) { const String pid = "Interstitial_Android"; await UnityAds.load( placementId: pid, onComplete: (placementId) => print('Load Complete $placementId'), onFailed: (placementId, error, message) => print('Load Failed $placementId: $error $message'), ); } } static showInterstitialAds() async { if (isCorrectPlatform) { const String pid = "Interstitial_Android"; final isLoaded = await UnityAds.isReady(placementId: pid); if (isLoaded) { UnityAds.showVideoAd( placementId: pid, onStart: (placementId) => print('Video Ad $placementId started'), onClick: (placementId) => print('Video Ad $placementId click'), onSkipped: (placementId) => print('Video Ad $placementId skipped'), onComplete: (placementId) { print('Video Ad $placementId completed'); LoadInterstitialAds(); }, onFailed: (placementId, error, message) { print('Video Ad $placementId failed: $error $message'); LoadInterstitialAds(); }, ); } else { print('Interstitial ad not ready, loading now...'); LoadInterstitialAds(); } } } }
额外检查项
- 确认Unity Ads后台的Game ID、广告位ID与代码中完全一致,无拼写错误
- 测试模式下将设备添加到Unity后台的测试设备列表,否则测试广告可能无法填充
- 升级
unity_ads_plugin到最新稳定版,避免SDK兼容性问题
内容的提问来源于stack exchange,提问作者Somnath Dash
相关产品推荐
相关产品推荐

