Show some 💙, 👍 the package & ⭐️ the repo to support the project
A plugin to easily integrate AdMob ads into your Flutter app.
⚠ Note
From version 26.3.12, this package supports AdMob only.
If you need Facebook, AppLovin, or Unity ads, you can use the alternative branches:
-
All Ad Networks (AdMob + Facebook + AppLovin + Unity)
https://github.com/nooralibutt/easy-ads/tree/feature/all-ads-support -
AdMob + Facebook Only
https://github.com/nooralibutt/easy-ads/tree/feature/admob-facebook
We've introduced a new autoLoadAds field in EasyAds initialization:
- Purpose: Control whether ads are loaded automatically or not.
- Default:
true(ads are loaded automatically on initialization) - Usage:
await EasyAds.instance.initialize( adIdManager, autoLoadAds: false, // disables automatic ad loading );```
If set to false, ads will not be loaded automatically. You must manually load ads using:
EasyAds.instance.loadAd(adUnitType: AdUnitType.interstitial);- Google Mobile Ads (Banner, Native, App Open, Interstitial, Rewarded)
- JIT (Just-in-Time) ad loading for Interstitial, App Open, and Rewarded ads
- Simple API for loading and displaying ads
- Event callbacks for ad lifecycle handling
This plugin supports AdMob Mediation.
You can configure additional ad networks directly in your AdMob dashboard while still using this plugin.
See the official guide:
https://developers.google.com/admob/flutter/mediation/get-started
A Consent Manager helper is provided to support GDPR and privacy dialogs. ConsentManager.gatherGdprConsent() and ConsentManager.gatherPrivacyConsent()
- The Google Mobile Ads App ID is required in your Info.plist.
Update your app's ios/Runner/Info.plist file to add two keys:
<key>GADApplicationIdentifier</key>
<string>YOUR_SDK_KEY</string>- You have to add
SKAdNetworkItemsfor all networks provided by easy-ads-flutter info.plist you can copy pasteSKAdNetworkItemsin your own project.
<manifest>
<application>
<!-- Sample AdMob App ID: ca-app-pub-3940256099942544~3347511713 -->
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy"/>
</application>
</manifest>import 'dart:io';
import 'package:easy_ads_flutter/easy_ads_flutter.dart';
class TestAdIdManager extends IAdIdManager {
const TestAdIdManager();
@override
AppAdIds? get admobAdIds => AppAdIds(
appId: Platform.isAndroid
? 'ca-app-pub-3940256099942544~3347511713'
: 'ca-app-pub-3940256099942544~1458002511',
appOpenId: Platform.isAndroid
? 'ca-app-pub-3940256099942544/9257395921'
: 'ca-app-pub-3940256099942544/5575463023',
bannerId: Platform.isAndroid
? 'ca-app-pub-3940256099942544/9214589741'
: 'ca-app-pub-3940256099942544/2435281174',
interstitialId: Platform.isAndroid
? 'ca-app-pub-3940256099942544/1033173712'
: 'ca-app-pub-3940256099942544/4411468910',
rewardedId: Platform.isAndroid
? 'ca-app-pub-3940256099942544/5224354917'
: 'ca-app-pub-3940256099942544/1712485313',
nativeBannerId: Platform.isAndroid
? 'ca-app-pub-3940256099942544/2247696110'
: 'ca-app-pub-3940256099942544/3986624511',
);
}Before loading ads, have your app initialize the Mobile Ads SDK by calling EasyAds.instance.initialize() which initializes the SDK and returns a Future that finishes once initialization is complete (or after a 30-second timeout). This needs to be done only once, ideally right before running the app.
import 'package:easy_ads_flutter/easy_ads_flutter.dart';
import 'package:flutter/material.dart';
const IAdIdManager adIdManager = TestAdIdManager();
EasyAds.instance.initialize(
adIdManager,
adMobAdRequest: const AdRequest(),
admobConfiguration: RequestConfiguration(testDeviceIds: [
'072D2F3992EF5B4493042ADC632CE39F', // Mi Phone
'00008030-00163022226A802E',
]),
);Ad is automatically loaded after being displayed or first time when you call initialize. But on safe side, you can call this method. This will load both rewarded and interstitial ads. If a particular ad is already loaded, it will not load it again.
EasyAds.instance.loadAd();EasyAds.instance.showAd(AdUnitType.rewarded);EasyAds.instance.showAd(AdUnitType.appOpen)This is how you may show banner ad in widget-tree somewhere:
@override
Widget build(BuildContext context) {
Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
SomeWidget(),
const Spacer(),
EasyBannerAd(adSize: AdSize.largeBanner),
],
);
}This package supports JIT (Just-in-Time) ad loading for Interstitial, App Open, and Rewarded ads.
You can show ads on demand, with callbacks for success, failure, and dismissal.
EasyAds.instance.showJitAppOpen(
onFailedToLoadOrShow: () => _showSnack('AppOpen failed'),
onAdShowed: () => _showSnack('AppOpen showed'),
onAdDismissed: () => _showSnack('AppOpen dismissed'),
);EasyAds.instance.showJitInterstitial(
context,
onFailedToLoadOrShow: () => _showSnack('Interstitial failed'),
onAdShowed: () => _showSnack('Interstitial showed'),
onAdDismissed: () => _showSnack('Interstitial dismissed'),
);EasyAds.instance.showJitRewarded(
context,
onEarnedReward: (ctx) => _showSnack('Reward earned!'),
);You can also create Native Ads and insert them into your widget tree using:
EasyAds.instance.createNativeAd();Example usage in a widget tree:
@override
Widget build(BuildContext context) {
return Column(
children: [
SomeWidget(),
EasyAds.instance.createNativeAd(),
AnotherWidget(),
],
);
}This ensures native ads are properly loaded and displayed within your UI.
Declare this object in the class
StreamSubscription? _streamSubscription;We are showing InterstitialAd here and also checking if ad has been shown.
If true, we are canceling the subscribed callbacks, if any.
Then, we are listening to the Stream and accessing the particular event we need
if (EasyAds.instance.showInterstitialAd()) {
// Canceling the last callback subscribed
_streamSubscription?.cancel();
// Listening to the callback from showInterstitialAd()
_streamSubscription =
EasyAds.instance.onEvent.listen((event) {
if (event.adUnitType == AdUnitType.interstitial &&
event.type == AdEventType.adDismissed) {
_streamSubscription?.cancel();
goToNextScreen(countryList[index]);
}
});
}