Search code examples
flutteradmobgoogle-mobile-adsadmob-rewardedvideoad

Google Mobile Ads Throwing MissingPluginException


RewardedAd doesn't work on google_mobile_ads: 2.0.1 I've already searched everywhere and the fixes don't work.

This is the Error on The Logs.

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): 

I already Ad this code on MainActivity

 override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
    GeneratedPluginRegistrant.registerWith(flutterEngine);
}

I made sure also to put this on build.gradle

implementation 'com.google.android.gms:play-services-ads:21.1.0'

I also add this to manifest file

<meta-data
       android:name="com.google.android.gms.ads.APPLICATION_ID"
       android:value="ca-app-pub-3940256099942544~3347511713" />

This is my implementation

I added this on my main

final initFuture = MobileAds.instance.initialize(); final adState = AdState(initFuture);

And Created another File for 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);

On my Implementation

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');
    }));

}


Solution

  • After making this issue traumatize me I managed to make it work. What I did is wrap everything in MaterialApp and put routes on my main Widget.

    runApp(
        MaterialApp(
          routes: <String, WidgetBuilder>{
            '/': (BuildContext context) => MyApp()
          },
        ),
      );
    

    As for how this works, I don't know how it fix everything but it might help you if you encounter this issue.