flutter_ads_sdk 0.1.2
flutter_ads_sdk: ^0.1.2 copied to clipboard
Flutter Ads SDK for Web, Mobile, and Desktop. Developer-controlled monetization with native UI ads, smart routing, transparent tracking, and no hidden logic.
Flutter Ads SDK - By Voyant Networks #
Platform-independent Flutter Ads SDK for Web, Desktop, and Mobile apps.
Monetize Flutter apps with full control using smart ad routing, transparent ad delivery, and developer-first infrastructure.
No hidden logic. No forced layouts. No automatic refresh cycles.
🌐 Links #
- 🚀 Docs: https://flutterads.com/docs
- 🌐 Platform: https://flutterads.com
- 🔑 Dashboard: https://console.voyantnetworks.com
- 🏢 Voyant Networks: https://voyantnetworks.com
✨ Features #
- Flutter Ads SDK for Web, Android, iOS, Windows, macOS, Linux
- Smart ad routing (geo, device, time-based)
- Fully customizable native ad UI
- Transparent impression and click tracking
- No hidden logic or forced optimization
- Developer-controlled ad lifecycle
Table of Contents #
- Why Flutter Ads Exists
- Core Principles
- Initialization
- Fetching Ads
- App Registration & Production Approval
- Supported Ad Formats
- Theming & UI Integration
- Rendering Ads
- Development Mode (Test Ads)
- Privacy & Data Model
- Platform Support
- License
Why Flutter Ads Exists #
Most advertising SDKs prioritize automation and internal optimization. Flutter Ads prioritizes developer ownership — predictable monetization, explicit control over ad lifecycle, and fixed revenue structure. It works consistently across all Flutter platforms: Android, iOS, Web, Windows, macOS, and Linux.
Platform Support #
Flutter Ads works everywhere Flutter runs.
Supported platforms:
- Android
- iOS
- Web
- Windows
- macOS
- Linux
Ad behavior, rendering logic, and monetization flow remain consistent across platforms.
No platform-specific integrations are required.
📦 Installation #
dependencies:
flutter_ads_sdk: latest
📩 Support & Contact #
Have questions or need production approval?
- SDK / Integration Support: sdk@voyantnetworks.com
- General Support: support@voyantnetworks.com
Core Principles #
Developer-Controlled Lifecycle #
Ads are requested, rendered, and refreshed only when you decide.
Fixed 25% Platform Fee #
Revenue share is flat and predefined — no dynamic cuts or silent changes.
Transparent Event Flow #
Impressions and clicks are explicitly triggered — no hidden polling or background refresh loops.
Native UI Integration #
Ads respect your layout and theming system instead of imposing external styles.
Cross-Platform Consistency #
Monetization behaves the same wherever Flutter runs.
Initialization #
Initialize the SDK before running your application.
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await FlutterAds.instance.ensureInitialized(
appId: 'YOUR_APP_ID',
apiKey: 'YOUR_API_KEY',
sdkSecret: 'YOUR_SDK_SECRET',
);
runApp(const MyApp());
}
Optional: Enable Auto Fetch Context #
If you want the SDK to automatically request more ads when supply is low, enable auto fetch once inside your app:
@override
Widget build(BuildContext context) {
FlutterAds.instance.enableAutoFetch(context);
return MaterialApp(
home: const HomePage(),
);
}
When auto fetch is enabled:
- The SDK stores device and layout context.
- Ads are automatically requested when inventory is near exhaustion.
- Future fetch operations do not require passing
BuildContext.
If auto fetch is not enabled, BuildContext must be provided manually when calling ensureAdsAvailable.
Fetching Ads #
Ads must be explicitly requested by the developer.
FlutterAds.instance.ensureAdsAvailable(
adType: AdType.native,
context: context, // Required only if enableAutoFetch() has NOT been called
);
If enableAutoFetch(context) has been enabled earlier,
passing BuildContext is no longer required for future fetch calls.
You may request ads:
- Inside
initState - On scroll triggers
- On lifecycle events
- On demand before rendering a placement
Flutter Ads internally throttles excessive requests and prevents unnecessary refetching when sufficient inventory is already available.
Important: Visibility Best Practice #
Ensure only one visible placement per ad format is on screen at a time.
Displaying multiple ads of the same format simultaneously (for example, multiple Mini Native ads fully visible in a feed) may result in:
- Impression throttling
- Impression rejection
- Reduced monetization efficiency
Design your layout so that only a single instance of each ad format is fully visible within the viewport at any given moment.
App Registration & Production Approval #
To use Flutter Ads in production, follow the approval workflow below.
1️⃣ Register Your Application #
Create your application at:
https://console.voyantnetworks.com
2️⃣ Generate API Credentials #
After registering your app, generate:
appIdapiKeysdkSecret
Your application will initially be in Pending Approval status.
You may integrate and test the SDK during this stage.
3️⃣ Integrate Credentials #
Add the generated credentials inside your Flutter application:
await FlutterAds.instance.ensureInitialized(
appId: 'YOUR_APP_ID',
apiKey: 'YOUR_API_KEY',
sdkSecret: 'YOUR_SDK_SECRET',
);
4️⃣ Publish Your App #
Release your application to its respective platform:
- Google Play Store
- Apple App Store
- Web (Production URL)
- Desktop distribution (Windows / macOS / Linux)
5️⃣ Request Production Enablement #
After your app is publicly available, contact:
Include:
- App name
- Store URL
- Registered App ID
Once reviewed and approved, your application will be moved to Production Mode.
Supported Ad Formats #
Flutter Ads supports multiple UI-integrated ad formats designed to fit naturally within your application layout.
enum AdType {
miniNative,
native,
nativeFullscreen,
rewarding,
videoEmbedded,
}
Mini Native #
Lightweight, inline ad component for list-based or feed-based layouts.

Native #
Expanded native ad layout with media support and full theming control.

Native Fullscreen #
Immersive ad experience designed for high-visibility placements.

Video Embedded #
Inline video player with integrated ad delivery.

Rewarding #
User-initiated full-screen ad format designed for optional rewards.

Theming & UI Integration #
All Flutter ad formats are fully themeable and integrate directly into your Flutter layout.
No external UI is injected, and no layout constraints are enforced.
You control:
- Typography
- Colors
- Media sizing
- Action button styling
- Layout placement
Each format exposes its own styling model.
Media Sizing #
Flutter Ads provides flexible height constraint models to control how media (image, video, carousel) scales within your layout.
// Media expands to fill available vertical space within parent constraints.
// Best for feed layouts or flexible containers.
ExpandedHeightConstraint();
// Media height is locked to an exact pixel value.
// Use when you need strict layout consistency.
FixedHeightConstraint(400);
// Media can shrink based on aspect ratio,
// but will never exceed the provided maximum height.
// Ideal for responsive layouts with upper bounds.
MaxHeightConstraint(400);
Mini Native #
Compact, feed-friendly ad that blends seamlessly into list items or lightweight content rows.
MiniNativeAdStylingModel(
logoSize: 30,
elevation: 0,
tileStyle: AdListTileStyle(
tileHeight: 45,
tileTitleAlignment: MainAxisAlignment.center,
tileElementsAlignment: CrossAxisAlignment.center,
tileColor: Colors.white,
titleTextStyle: const TextStyle(color: Colors.black, fontSize: 11),
subtitleTextStyle: const TextStyle(color: Colors.grey, fontSize: 10),
),
actionButtonColor: Theme.of(context).primaryColor,
)
Native #
Flexible content-style ad with media, description, and CTA designed for full layout integration.
NativeAdStylingModel(
logoSize: 30,
logoBackgroundColor: Theme.of(context).primaryColor,
descriptionStyle: const TextStyle(color: Colors.black, fontSize: 12),
actionStyle: const TextStyle(color: Colors.white, fontSize: 10),
headerTileStyle: AdListTileStyle(
tileHeight: 45,
tileTitleAlignment: MainAxisAlignment.start,
tileElementsAlignment: CrossAxisAlignment.center,
tileColor: Colors.white,
titleTextStyle: const TextStyle(color: Colors.black, fontSize: 11),
subtitleTextStyle: const TextStyle(color: Colors.grey, fontSize: 10),
),
footerTileStyle: AdListTileStyle(
tileHeight: 45,
tileTitleAlignment: MainAxisAlignment.spaceEvenly,
tileElementsAlignment: CrossAxisAlignment.center,
tileColor: Colors.indigo,
titleTextStyle: const TextStyle(color: Colors.white, fontSize: 11),
subtitleTextStyle: const TextStyle(color: Colors.white, fontSize: 10),
),
)
Native Fullscreen #
Immersive, edge-to-edge format optimized for high-visibility placements and rich media.
NativeFullScreenAdStylingModel(
logoSize: 30,
headerTileStyle: AdListTileStyle(
tileHeight: 45,
tileTitleAlignment: MainAxisAlignment.start,
tileElementsAlignment: CrossAxisAlignment.center,
tileColor: Colors.transparent,
titleTextStyle: TextStyle(color: Colors.white, fontSize: 11),
subtitleTextStyle: TextStyle(color: Colors.white, fontSize: 10),
),
footerTileStyle: AdListTileStyle(
tileHeight: 45,
tileTitleAlignment: MainAxisAlignment.spaceEvenly,
tileElementsAlignment: CrossAxisAlignment.center,
tileColor: Colors.transparent,
titleTextStyle: TextStyle(color: Colors.white, fontSize: 11),
subtitleTextStyle: TextStyle(color: Colors.white, fontSize: 10),
),
descriptionStyle: TextStyle(
color: Colors.white,
fontSize: 10,
fontWeight: FontWeight.normal,
),
actionStyle: TextStyle(color: Colors.white, fontSize: 10),
)
Rewarding #
User-initiated ad format that grants rewards after successful completion.
RewardingAdStylingModel(
headerTitleStyle: TextStyle(
color: Colors.white,
fontSize: 14,
),
headerSubtitleStyle: TextStyle(
color: Colors.white,
fontSize: 12,
),
footerTileStyle: AdListTileStyle(
tileTitleAlignment: MainAxisAlignment.spaceEvenly,
tileElementsAlignment: CrossAxisAlignment.center,
tileColor: Colors.indigo,
titleTextStyle: TextStyle(
color: Colors.white,
fontSize: 14,
),
subtitleTextStyle: TextStyle(
color: Colors.white,
fontSize: 12,
),
),
descriptionStyle: TextStyle(
color: Colors.white,
fontSize: 14,
fontWeight: FontWeight.normal,
),
actionStyle: TextStyle(color: Colors.white, fontSize: 13),
)
Video Embedded #
In-stream video ad integrated directly inside your video playback experience.
VideoEmbeddedAdStylingModel(
logoSize: 30,
actionStyle: TextStyle(color: Colors.white, fontSize: 10),
footerTileStyle: AdListTileStyle(
tileHeight: 45,
tileTitleAlignment: MainAxisAlignment.spaceEvenly,
tileElementsAlignment: CrossAxisAlignment.center,
tileColor: Colors.black.withValues(alpha: 0.1),
titleTextStyle: TextStyle(color: Colors.white, fontSize: 11),
subtitleTextStyle: TextStyle(color: Colors.white, fontSize: 10),
),
overlayColor: Colors.black.withValues(alpha: 0.1),
onOverlayColor: Colors.white,
)
Rendering Ads #
Ads are rendered explicitly using widget calls.
Flutter Ads never auto-inserts placements — you decide where ads appear in your layout.
Mini Native #
// Always returns a widget.
// If an ad is available it renders it,
// otherwise the provided placeholder is shown.
FlutterAds.instance.getMiniNativeAdWidget(
placeholderWidget: const SizedBox(height: 60),
testMode: true,
styling: MiniNativeAdStylingModel(),
);
// Returns a widget only if an ad is available.
// If no ad exists, returns null — allowing you
// to conditionally render or skip placement.
FlutterAds.instance.maybeGetMiniNativeAdWidget(
placeholderWidget: const SizedBox(height: 60),
testMode: true,
styling: MiniNativeAdStylingModel(),
);
Native #
// Always returns a widget.
// If an ad is available it renders it,
// otherwise the provided placeholder is shown.
FlutterAds.instance.getNativeAdWidget(
placeholderWidget: const SizedBox(height: 60),
testMode: true,
heightConstraint: MaxHeightConstraint(400),
styling: NativeAdStylingModel(),
);
// Returns a widget only if an ad is available.
// If no ad exists, returns null — allowing you
// to conditionally render or skip placement.
FlutterAds.instance.maybeGetNativeAdWidget(
placeholderWidget: const SizedBox(height: 60),
testMode: true,
heightConstraint: MaxHeightConstraint(400),
styling: NativeAdStylingModel(),
);
Native Fullscreen #
// Always returns a widget.
// If an ad is available it renders it,
// otherwise the provided placeholder is shown.
FlutterAds.instance.getNativeFullScreenAdWidget(
placeholderWidget: const SizedBox.shrink(),
testMode: true,
styling: NativeFullScreenAdStylingModel(),
);
// Returns a widget only if an ad is available.
// If no ad exists, returns null — allowing you
// to conditionally render or skip placement.
FlutterAds.instance.maybeGetNativeFullScreenAdWidget(
placeholderWidget: const SizedBox.shrink(),
testMode: true,
styling: NativeFullScreenAdStylingModel(),
);
Rewarding #
Rewarding ads are explicitly shown using navigation.
await FlutterAds.instance.showRewardingAd(
context: context,
testMode: true,
styling: RewardingAdStylingModel(),
onSuccess: () {
// reward user
},
onFailure: () {
// ad dismissed or failed
},
);
Video Embedded #
A cross-platform video player with built-in ad slots.
Ads are inserted at fixed time intervals while maintaining full playback control.
// Creates a video player that automatically inserts ads
// at configured time intervals during playback.
FlutterAds.instance.getVideoPlayerWithEmbeddedAdsWidget(
videoUrl,
testMode: true,
heightConstraint: MaxHeightConstraint(400),
);
Development Mode (Test Ads) #
Flutter provides a built-in demo system for development and UI testing.
No network calls are made when using test ads.
1️⃣ Populate Demo Ads #
Call this once during development (for example in initState):
// Fills all ad formats with prebuilt demo data.
// No server connection is required.
FlutterAdsDummyDataHelper.fillDemoAds();
2️⃣ Enable Test Mode When Rendering #
Pass testMode: true when requesting widgets.
FlutterAds.instance.getMiniNativeAdWidget(
placeholderWidget: const SizedBox(height: 60),
testMode: true,
);
When testMode is enabled:
- Ads are served from local demo data
- No impressions are sent to the server
- No production revenue logic is triggered
- Safe for UI development and layout testing
Important #
Do not enable testMode in production builds.
Privacy & Data Model #
Flutter Ads is designed to minimize data collection by default.
No personal identity information is collected or stored.
What Is NOT Collected #
- No emails
- No phone numbers
- No contact lists
- No precise location
- No cross-app tracking
- No behavioral profiling
Flutter Ads does not build user identity graphs or track users across applications.
What Is Used (Non-Personal Signals Only) #
To serve ads and prevent abuse, the SDK may use:
- App identifier
- Platform (Android, iOS, Web, macOS, Windows, Linux)
- Device type (mobile, tablet, desktop)
- Anonymous SDK-generated device ID (app-scoped)
- Optional age group or gender (only if provided by the developer)
All signals are non-personal and scoped to the application using the SDK.
🔍 Keywords #
flutter ads sdk, flutter monetization, ads sdk for flutter, mobile ads sdk, web ads sdk, native ads flutter, developer monetization sdk
License #
MIT License © 2026 Voyant Networks
Usage is permitted only for authorized applications with valid credentials
(appId, apiKey, and sdkSecret) issued by Voyant Networks.
Applications must be registered at: https://console.voyantnetworks.com
Unauthorized redistribution, modification, reverse engineering, or resale of the SDK is strictly prohibited.