google_mobile_ads 2.0.1版本RewardedAd失效,报MissingPluginException求助
google_mobile_ads:2.0.1版本RewardedAd无法正常工作的解决方案
错误日志
E/DartMessenger( 5002): Uncaught exception in binary message listener E/DartMessenger( 5002): java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map E/DartMessenger( 5002): at io.flutter.plugins.googlemobileads.AdMessageCodec.readValueOfType(AdMessageCodec.java:231) E/DartMessenger( 5002): at io.flutter.plugin.common.StandardMessageCodec.readValue(StandardMessageCodec.java:340) E/DartMessenger( 5002): at io.flutter.plugin.common.StandardMessageCodec.readValueOfType(StandardMessageCodec.java:434) E/DartMessenger( 5002): at io.flutter.plugins.googlemobileads.AdMessageCodec.readValueOfType(AdMessageCodec.java:319) E/DartMessenger( 5002): at io.flutter.plugin.common.StandardMessageCodec.readValue(StandardMessageCodec.java:340) E/DartMessenger( 5002): at io.flutter.plugin.common.StandardMethodCodec.decodeMethodCall(StandardMethodCodec.java:51) E/DartMessenger( 5002): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:260) E/DartMessenger( 5002): at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:295) E/DartMessenger( 5002): at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$DartMessenger(DartMessenger.java:319) E/DartMessenger( 5002): at io.flutter.embedding.engine.dart.-$$Lambda$DartMessenger$TsixYUB5E6FpKhMtCSQVHKE89gQ.run(Unknown Source:12) E/DartMessenger( 5002): at android.os.Handler.handleCallback(Handler.java:883) E/DartMessenger( 5002): at android.os.Handler.dispatchMessage(Handler.java:100) E/DartMessenger( 5002): at android.os.Looper.loop(Looper.java:237) E/DartMessenger( 5002): at android.app.ActivityThread.main(ActivityThread.java:7830) E/DartMessenger( 5002): at java.lang.reflect.Method.invoke(Native Method) E/DartMessenger( 5002): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) E/DartMessenger( 5002): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1040)
E/flutter ( 5002): [ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: MissingPluginException(No implementation found for method loadRewardedAd on channel plugins.flutter.io/google_mobile_ads) E/flutter ( 5002): #0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:165:7) E/flutter ( 5002): <asynchronous suspension> E/flutter ( 5002): #1 RewardedAd.load (package:google_mobile_ads/src/ad_containers.dart:1154:5) E/flutter ( 5002): <asynchronous suspension> E/flutter ( 5002):
已完成的配置与实现
Android端配置
- MainActivity代码:
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { GeneratedPluginRegistrant.registerWith(flutterEngine); }
- build.gradle依赖:
implementation 'com.google.android.gms:play-services-ads:21.1.0'
- AndroidManifest.xml配置:
<meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-3940256099942544~3347511713" />
Flutter端实现
- main入口初始化:
final initFuture = MobileAds.instance.initialize(); final adState = AdState(initFuture);
- AdState类:
static String get rewardedAdUnitId { if (Platform.isAndroid) { return "ca-app-pub-3940256099942544/5224354917"; } else if (Platform.isIOS) { return "ca-app-pub-3940256099942544/1712485313"; } else { throw new UnsupportedError("Unsupported platform"); } } Future initialization; AdState(this.initialization);
- 广告加载代码:
void loadRewardedAd(BuildContext context) { RewardedAd.load( adUnitId: AdState.rewardedAdUnitId, request: const AdRequest(), rewardedAdLoadCallback: RewardedAdLoadCallback(onAdLoaded: (ad) { ad.show( onUserEarnedReward: (ad,rewardPoints){ CommonTools.showMessage(context, 'Energy Received : '); } ); ad.fullScreenContentCallback = FullScreenContentCallback( onAdShowedFullScreenContent: (ad){ }, onAdFailedToShowFullScreenContent: (ad,error){ CommonTools.showMessage(context, 'Ads Not Available For Now'); ad.dispose(); }, onAdDismissedFullScreenContent: (ad){ CommonTools.showMessage(context, 'Ads Not Available For Now'); ad.dispose(); } ); }, onAdFailedToLoad: (er) { CommonTools.showMessage(context, 'Ads Not Available For Now'); })); }
解决方案
1. 修正插件注册方式
google_mobile_ads 2.x版本不再通过GeneratedPluginRegistrant自动注册,需要手动调用插件注册方法。修改MainActivity代码:
import io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) GoogleMobileAdsPlugin.registerWith(flutterEngine) }
2. 匹配play-services-ads版本
google_mobile_ads:2.0.1对应的play-services-ads版本为20.6.0,版本不兼容会导致消息编解码错误。修改build.gradle中的依赖:
implementation 'com.google.android.gms:play-services-ads:20.6.0'
3. 清理项目缓存并重建
执行以下命令清理缓存,避免旧代码残留:
flutter clean flutter pub get cd android && ./gradlew clean cd .. flutter run
原因说明
MissingPluginException是因为插件未正确注册,导致Flutter端无法找到原生实现方法ClassCastException是由于play-services-ads版本与插件版本不匹配,造成消息编解码时类型转换失败
内容的提问来源于stack exchange,提问作者mathematics
相关产品推荐
相关产品推荐

