You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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端配置

  1. MainActivity代码:
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
    GeneratedPluginRegistrant.registerWith(flutterEngine);
}
  1. build.gradle依赖:
implementation 'com.google.android.gms:play-services-ads:21.1.0'
  1. AndroidManifest.xml配置:
<meta-data
       android:name="com.google.android.gms.ads.APPLICATION_ID"
       android:value="ca-app-pub-3940256099942544~3347511713" />

Flutter端实现

  1. main入口初始化:
final initFuture = MobileAds.instance.initialize();
final adState = AdState(initFuture);
  1. 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);
  1. 广告加载代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 23:27:28