flutter_native_admob
Plugin to integrate Firebase Native Admob to Flutter application Platform supported: iOS, Android
Getting Started
For help getting started with Flutter, view our online documentation.
Setup Android project
- Add the classpath to the [project]/android/build.gradle file.
dependencies { // Example existing classpath classpath 'com.android.tools.build:gradle:3.2.1' // Add the google services classpath classpath 'com.google.gms:google-services:4.3.0' }
- Add the apply plugin to the [project]/android/app/build.gradle file.
// ADD THIS AT THE BOTTOM apply plugin: 'com.google.gms.google-services'
- Add your Admob App ID.
Important: This step is required as of Google Mobile Ads SDK version 17.0.0. Failure to add this tag results in a crash with the message: The Google Mobile Ads SDK was initialized incorrectly.
<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>
Setup iOS project
- Add Admob App ID:
Important: This step is required as of Google Mobile Ads SDK version 7.42.0. Failure to add add this Info.plist entry results in a crash with the message: The Google Mobile Ads SDK was initialized incorrectly.
In your app’s Info.plist file, add a GADApplicationIdentifier key with a string value of your AdMob app ID. You can find your App ID in the AdMob UI.
You can make this change programmatically:
<key>GADApplicationIdentifier</key> <string>Your_Admob_App_ID</string>
- Add embeded view support:
In your app’s Info.plist file, add this
<key>io.flutter.embedded_views_preview</key> <true/>
How it works
NativeAdmob
is a Flutter widget, so you can add it anywhere in Flutter application.
Property | Description | Type |
---|---|---|
adUnitID | Your ad unit ID to load | String |
loading | A widget to show when the ad is loading | Widget |
error | A widget to show when the ad got error | Widget |
options | Native ad styling options | NativeAdmobOptions |
type | Native ad type (banner or full) | NativeAdmobType.full |
controller | Controller for controlling the NativeAdmob widget | NativeAdmobController |
NativeAdmobOptions
Property | Description | Type | Default value |
---|---|---|---|
showMediaContent | Whether to show the media content or not | bool | true |
ratingColor | Rating star color | Color | Colors.yellow |
adLabelTextStyle | The ad label on the top left corner | NativeTextStyle | fontSize: 12, color: Colors.white, backgroundColor: Color(0xFFFFCC66) |
headlineTextStyle | The ad headline title | NativeTextStyle | fontSize: 16, color: Colors.black |
advertiserTextStyle | Identifies the advertiser. For example, the advertiser’s name or visible URL. (below headline) | NativeTextStyle | fontSize: 14, color: Colors.black |
bodyTextStyle | The ad description | NativeTextStyle | fontSize: 12, color: Colors.grey |
storeTextStyle | The app store name. For example, “App Store”. | NativeTextStyle | fontSize: 12, color: Colors.black |
priceTextStyle | String representation of the app’s price. | NativeTextStyle | fontSize: 12, color: Colors.black |
callToActionStyle | Text that encourages user to take some action with the ad. For example “Install”. | NativeTextStyle | fontSize: 15, color: Colors.white, backgroundColor: Color(0xFF4CBE99) |
NativeTextStyle
Property | Description | Type |
---|---|---|
fontSize | Text font size | double |
color | Text color | Color |
backgroundColor | Background color | Color |
isVisible | Whether to show or not | bool |
NativeAdmobController
Property/Function | Description | Type |
---|---|---|
stateChanged | Stream that notify each time the loading state changed | Stream |
void setAdUnitID(String adUnitID) | Change the ad unit ID, it will load the ad again if the id is changed from previous | |
void reloadAd({bool forceRefresh = false}) | Reload the ad |
Examples
Default
NativeAdmob( adUnitID: "<Your ad unit ID>" )
Using controller, loading, error widget, type and options
final _controller = NativeAdmobController(); NativeAdmob( adUnitID: "<Your ad unit ID>", loading: Center(child: CircularProgressIndicator()), error: Text("Failed to load the ad"), controller: _controller, type: NativeAdmobType.full, options: NativeAdmobOptions( ratingColor: Colors.red, // Others ... ), )
Hide the ad until it load completed
import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_native_admob/flutter_native_admob.dart'; import 'package:flutter_native_admob/native_admob_controller.dart'; class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { static const _adUnitID = "<Your ad unit ID>"; final _nativeAdController = NativeAdmobController(); double _height = 0; StreamSubscription _subscription; @override void initState() { _subscription = _nativeAdController.stateChanged.listen(_onStateChanged); super.initState(); } @override void dispose() { _subscription.cancel(); _nativeAdController.dispose(); super.dispose(); } void _onStateChanged(AdLoadState state) { switch (state) { case AdLoadState.loading: setState(() { _height = 0; }); break; case AdLoadState.loadCompleted: setState(() { _height = 330; }); break; default: break; } } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: const Text('Plugin example app'), ), body: ListView( children: <Widget>[ Container( margin: EdgeInsets.only(bottom: 20.0), height: 200.0, color: Colors.green, ), Container( margin: EdgeInsets.only(bottom: 20.0), height: 200.0, color: Colors.green, ), Container( margin: EdgeInsets.only(bottom: 20.0), height: 200.0, color: Colors.green, ), Container( height: _height, padding: EdgeInsets.all(10), margin: EdgeInsets.only(bottom: 20.0), child: NativeAdmob( // Your ad unit id adUnitID: _adUnitID, controller: _nativeAdController, // Don't show loading widget when in loading state loading: Container(), ), ), Container( margin: EdgeInsets.only(bottom: 20.0), height: 200.0, color: Colors.green, ), Container( margin: EdgeInsets.only(bottom: 20.0), height: 200.0, color: Colors.green, ), Container( margin: EdgeInsets.only(bottom: 20.0), height: 200.0, color: Colors.green, ), ], ), ), ); } }
Prevent ad from reloading on ListView/GridView
When putting NativeAdmob
in ListView/GridView, it will keep reloading as the PlatformView
init again when scrolling to the item. To prevent from reloading and take full control of the NativeAdmob
, we can create NativeAdmobController
and keep it
import 'package:flutter/material.dart'; import 'package:flutter_native_admob/flutter_native_admob.dart'; import 'package:flutter_native_admob/native_admob_controller.dart'; void main() => runApp(MyApp()); class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { static const _adUnitID = "<Your ad unit ID>"; final _controller = NativeAdmobController(); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: const Text('Plugin example app'), ), body: ListView( children: <Widget>[ Container( margin: EdgeInsets.only(bottom: 20.0), height: 200.0, color: Colors.green, ), Container( margin: EdgeInsets.only(bottom: 20.0), height: 200.0, color: Colors.green, ), Container( margin: EdgeInsets.only(bottom: 20.0), height: 200.0, color: Colors.green, ), Container( height: 330, padding: EdgeInsets.all(10), margin: EdgeInsets.only(bottom: 20.0), child: NativeAdmob( adUnitID: _adUnitID, controller: _controller, ), ), Container( margin: EdgeInsets.only(bottom: 20.0), height: 200.0, color: Colors.green, ), Container( margin: EdgeInsets.only(bottom: 20.0), height: 200.0, color: Colors.green, ), Container( margin: EdgeInsets.only(bottom: 20.0), height: 200.0, color: Colors.green, ), Container( height: 330, padding: EdgeInsets.all(10), margin: EdgeInsets.only(bottom: 20.0), child: NativeAdmob( adUnitID: _adUnitID, controller: _controller, ), ), ], ), ), ); } }
Download source code on GitHub
Provides the list of the opensource Flutter apps collection with GitHub repository.