flutter_admob_kit 3.0.3
flutter_admob_kit: ^3.0.3 copied to clipboard
AdMob library for Flutter with Banner, Interstitial, Rewarded, App Open, and Native ads support.
flutter_admob_kit #
Flutter port of shahid0/AdMobKit (Swift/SwiftUI).
Same ViewModel pattern. Same callbacks. Same isInProScreen guard. Just Flutter.
โจ Features #
| Feature | Details |
|---|---|
| ๐บ All ad formats | Banner, Interstitial, Rewarded, Rewarded Interstitial, App Open, Native |
| ๐ Auto retry | Retries failed loads up to 3 times (2s, 4s, 6s backoff) |
| โฑ๏ธ Expiry handling | Discards stale ads automatically โ no more black screens |
| ๐ช Coin tracking | coins property with onCoinsEarned callback |
| ๐ก๏ธ Paywall guard | AppOpenAdManager.isInProScreen prevents ads on purchase screens |
| ๐ Click threshold | Show interstitial after N clicks automatically |
๐ฆ Installation #
dependencies:
flutter_admob_kit: ^3.0.2
flutter pub get
๐ Setup #
Initialize once in main.dart:
import 'package:google_mobile_ads/google_mobile_ads.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await MobileAds.instance.initialize();
runApp(const MyApp());
}
๐ฑ Usage #
Banner Ad #
// Swift: BannerAdView(AdUnitID: "...", adLoadFailed: $failed)
BannerAdWidget(
adUnitId: 'ca-app-pub-XXXX/XXXX',
onAdLoadFailed: () => setState(() => _showBanner = false),
)
Interstitial Ad #
// Swift: @StateObject var interstitialVM = InterstitialViewModel()
final _vm = InterstitialAdManager();
@override
void initState() {
super.initState();
_vm.onAdLoadComplete = () => print('Ad loaded!');
_vm.onAdDismissed = () => Navigator.pushNamed(context, '/home');
_vm.loadAd('ca-app-pub-XXXX/XXXX');
}
// Show immediately
_vm.showAd();
// Show after N clicks (bottom nav, general buttons)
_vm.onClickEvent('ca-app-pub-XXXX/XXXX', threshold: 3);
@override
void dispose() {
_vm.dispose();
super.dispose();
}
App Open Ad #
// Swift: @StateObject var appOpenVM = AppOpenAdManager()
final _appOpenVM = AppOpenAdManager();
@override
void initState() {
super.initState();
_appOpenVM.onAdDismissed = () => widget.onFinish();
_appOpenVM.loadAd('ca-app-pub-XXXX/XXXX').then((_) {
_appOpenVM.showAdIfAvailable('ca-app-pub-XXXX/XXXX');
});
}
@override
void dispose() {
_appOpenVM.dispose();
super.dispose();
}
Prevent on paywall โ same as Swift:
@override
void initState() {
super.initState();
AppOpenAdManager.isInProScreen = true; // onAppear
}
@override
void dispose() {
AppOpenAdManager.isInProScreen = false; // onDisappear
super.dispose();
}
Rewarded Ad #
// Swift: @StateObject var rewardedVM = RewardedViewModel()
final _rewardedVM = RewardedAdManager();
@override
void initState() {
super.initState();
_rewardedVM.onAdDismissed = () { };
_rewardedVM.onCoinsEarned = (coins) => print('Coins: $coins');
_rewardedVM.loadAd('ca-app-pub-XXXX/XXXX');
}
// Show only when ready
ElevatedButton(
onPressed: _rewardedVM.isAdReady ? () => _rewardedVM.showAd() : null,
child: const Text('Watch Ad'),
)
// Listen to coins โ Swift: .onChange(of: rewardedVM.coins)
ListenableBuilder(
listenable: _rewardedVM,
builder: (_, __) => Text('Coins: ${_rewardedVM.coins}'),
)
Rewarded Interstitial Ad #
// Swift: @StateObject var riVM = RewardedInterstitialViewModel()
final _riVM = RewardedInterstitialAdManager();
@override
void initState() {
super.initState();
_riVM.onAdDismissed = () { };
_riVM.onCoinsEarned = (coins) => print('Coins: $coins');
_riVM.loadAd('ca-app-pub-XXXX/XXXX');
}
_riVM.showAd();
Native Ad #
// Swift: @StateObject var nativeVM = NativeAdViewModel(adUnitID: "...")
final _nativeVM = NativeAdManager(adUnitId: 'ca-app-pub-XXXX/XXXX');
@override
void initState() {
super.initState();
_nativeVM.refreshAd(); // Swift: nativeVM.refreshAd()
}
// In build โ Swift: GoogleNativeAdView(nativeViewModel: nativeVM)
ListenableBuilder(
listenable: _nativeVM,
builder: (_, __) => NativeAdWidget(manager: _nativeVM, height: 300),
)
@override
void dispose() {
_nativeVM.dispose();
super.dispose();
}
๐ Swift โ Flutter API #
| Swift | Flutter |
|---|---|
@StateObject var vm = InterstitialViewModel() |
final vm = InterstitialAdManager() |
vm.onAdLoadComplete = { } |
vm.onAdLoadComplete = () { } |
vm.onAdDismissed = { } |
vm.onAdDismissed = () { } |
await vm.loadAd(adUnitID: "...") |
await vm.loadAd('...') |
vm.showAd() |
vm.showAd() |
AppOpenAdManager.isInProScreen = true |
AppOpenAdManager.isInProScreen = true |
.onChange(of: vm.coins) |
ListenableBuilder(listenable: vm, ...) |
nativeVM.refreshAd() |
nativeVM.refreshAd() |
๐งช Test Ad Unit IDs #
| Format | Test ID |
|---|---|
| App Open | ca-app-pub-3940256099942544/9257395921 |
| Interstitial | ca-app-pub-3940256099942544/1033173712 |
| Banner | ca-app-pub-3940256099942544/6300978111 |
| Native | ca-app-pub-3940256099942544/2247696110 |
| Rewarded | ca-app-pub-3940256099942544/5224354917 |
| Rewarded Interstitial | ca-app-pub-3940256099942544/6978759866 |
๐ License #
MIT ยฉ Ameerhamza-tech
Flutter port of shahid0/AdMobKit by Shahid Hussain.