flutter_ads_manager 0.0.9
flutter_ads_manager: ^0.0.9 copied to clipboard
Drop-in AdMob ads for Flutter: banner, interstitial, rewarded, rewarded interstitial and app open ads with auto-reload, retry, and built-in GDPR consent.
flutter_ads_manager #
Drop-in AdMob ads for Flutter. Call init() once, then use AdBannerWidget
and AdsManager.instance for every ad type — banner, interstitial, rewarded,
rewarded interstitial, and app open — without writing ad-loading code
yourself.
Built on google_mobile_ads.
It handles:
- Loading, retrying, and reloading ads automatically
- Google's test ad IDs in debug builds, so you never show real ads by accident
- GDPR/UK/US consent (shown automatically before ads load)
- "Show an interstitial every 3rd time" style frequency capping
- Keywords for better ad targeting
AdMob still requires a native App ID in
AndroidManifest.xml/Info.plistfor every app — that's a Google requirement, not something any package can remove. Everything else is handled for you.
Setup #
1. Add the dependency #
dependencies:
flutter_ads_manager: ^0.0.1
2. Add your AdMob App ID #
Android — android/app/src/main/AndroidManifest.xml, inside <application>:
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy"/>
iOS — ios/Runner/Info.plist:
<key>GADApplicationIdentifier</key>
<string>ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy</string>
3. Initialize once, at startup #
import 'package:flutter/material.dart';
import 'package:flutter_ads_manager/flutter_ads_manager.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await AdsManager.instance.init(
adUnitIds: const AdUnitIdSet(
android: AdUnitIds(
banner: 'ca-app-pub-xxxxxxxxxxxxxxxx/1111111111',
interstitial: 'ca-app-pub-xxxxxxxxxxxxxxxx/2222222222',
rewarded: 'ca-app-pub-xxxxxxxxxxxxxxxx/3333333333',
rewardedInterstitial: 'ca-app-pub-xxxxxxxxxxxxxxxx/4444444444',
appOpen: 'ca-app-pub-xxxxxxxxxxxxxxxx/5555555555',
),
ios: AdUnitIds(
banner: 'ca-app-pub-xxxxxxxxxxxxxxxx/6666666666',
interstitial: 'ca-app-pub-xxxxxxxxxxxxxxxx/7777777777',
rewarded: 'ca-app-pub-xxxxxxxxxxxxxxxx/8888888888',
rewardedInterstitial: 'ca-app-pub-xxxxxxxxxxxxxxxx/9999999999',
appOpen: 'ca-app-pub-xxxxxxxxxxxxxxxx/0000000000',
),
),
showAppOpenOnResume: true, // auto-shows an app open ad on resume
);
runApp(const MyApp());
}
That's it — every ad type is now ready to use anywhere in your app.
Usage #
Banner #
const AdBannerWidget(variant: BannerAdVariant.adaptive) // full-width, ~90-100dp tall
const AdBannerWidget(variant: BannerAdVariant.compactAdaptive) // full-width, ~50-90dp tall
const AdBannerWidget(variant: BannerAdVariant.standard) // 320x50
const AdBannerWidget(variant: BannerAdVariant.largeBanner) // 320x100
const AdBannerWidget(variant: BannerAdVariant.mediumRectangle) // 300x250
Just place it in your layout — it loads itself and shows nothing while loading or if it fails, so it never leaves a gap. A failed load retries on its own with capped exponential backoff, same as the full-screen ad types.
Interstitial #
await AdsManager.instance.interstitial.show();
Counted interstitial (every Nth time) #
// Shows an interstitial only on the 3rd, 6th, 9th... call for this trigger.
await AdsManager.instance.countedInterstitial.registerEventAndMaybeShow(
'level_complete',
every: 3,
);
Rewarded #
AdsManager.instance.rewarded.load(); // call ahead of time
if (AdsManager.instance.rewarded.isReady) {
await AdsManager.instance.rewarded.show(
onUserEarnedReward: (ad, reward) => grantCoins(reward.amount.toInt()),
);
}
Rewarded interstitial #
Same as rewarded:
await AdsManager.instance.rewardedInterstitial.show(
onUserEarnedReward: (ad, reward) => grantCoins(reward.amount.toInt()),
);
App open #
// Automatic: pass showAppOpenOnResume: true to init().
// Or manually:
await AdsManager.instance.appOpen.show();
Consent (GDPR/UMP) #
Handled automatically. If you need a "Privacy options" button in your settings screen:
if (await AdsManager.instance.consent.isPrivacyOptionsRequired) {
await AdsManager.instance.consent.showPrivacyOptionsForm();
}
Keywords (better ad targeting) #
Describe your app or its current content so AdMob can pick more relevant ads:
AdsManager.instance.keywords = ['sports', 'basketball'];
Testing on a real device with real ad unit IDs #
await AdsManager.instance.init(
adUnitIds: ...,
testDeviceIds: ['33BE2250B43518CCDA7DE426D04EE231'], // printed to console on first request
);
Troubleshooting #
An ad shows behind my app's UI (e.g. AppBar visible over an interstitial).
This is a known issue on some Android devices, unrelated to this package —
the ad's Activity doesn't cover the status bar area the way yours does. Fix
it by keeping your app in immersive mode (already done in this repo's
example/android/.../MainActivity.kt):
class MainActivity : FlutterActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
WindowCompat.setDecorFitsSystemWindows(window, false)
WindowInsetsControllerCompat(window, window.decorView)
.hide(WindowInsetsCompat.Type.systemBars())
}
}
Screen stays awake during ads #
Loading a full-screen ad's SDK (its WebView) can take a few seconds. On an
idle device, that's sometimes long enough for the screen to time out and
sleep before the ad ever appears. AdsManager keeps the screen awake from
the moment a full-screen ad is triggered until it's dismissed, so this
never happens — no setup required, no extra permissions on Android or iOS.
API surface #
| Type | Purpose |
|---|---|
AdsManager.instance |
Singleton entry point; call .init(...) once |
AdBannerWidget |
Drop-in widget for all banner sizes |
AdsManager.instance.interstitial |
InterstitialAdController |
AdsManager.instance.countedInterstitial |
CountedInterstitialController |
AdsManager.instance.rewarded |
RewardedAdController |
AdsManager.instance.rewardedInterstitial |
RewardedInterstitialAdController |
AdsManager.instance.appOpen |
AppOpenAdController |
AdsManager.instance.consent |
ConsentManager (UMP/GDPR) |
AdUnitIds / AdUnitIdSet |
Your per-platform ad unit ID configuration |
TestAdUnitIds |
Google's official test ad unit IDs |
Notes #
- Android
minSdkVersion21+, iOS 13.0+ (same asgoogle_mobile_ads). - Not usable on web/desktop — AdMob is mobile-only.