in_house_ads 1.6.0
in_house_ads: ^1.6.0 copied to clipboard
Reusable in-house (cross-promo) native, banner, interstitial, and rewarded ads for Android Flutter apps.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:in_house_ads/in_house_ads.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
InHouseAds.configure(
const InHouseAdsConfig(
assetPath: 'assets/in_house_ads/apps.json',
currentAppId: 'com.example.in_house_ads_example',
remoteUrl: 'https://vaibhavrakholiya.github.io/in-app-ads-data.json',
remoteRefreshInterval: Duration(hours: 6),
theme: InHouseAdsTheme(
cardColor: Color(0xFFFFFFFF),
borderColor: Color(0xFFBBF7D0),
badgeBackground: Color(0xFFDCFCE7),
accentColor: Color(0xFF16A34A),
ctaTextColor: Color(0xFFFFFFFF),
),
),
);
runApp(const InHouseAdsExampleApp());
}
class InHouseAdsExampleApp extends StatelessWidget {
const InHouseAdsExampleApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'in_house_ads example',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: const Color(0xFF16A34A)),
useMaterial3: true,
),
home: const ExampleHomePage(),
);
}
}
class ExampleHomePage extends StatefulWidget {
const ExampleHomePage({super.key});
@override
State<ExampleHomePage> createState() => _ExampleHomePageState();
}
class _ExampleHomePageState extends State<ExampleHomePage> {
InHouseAd? _nativeAd;
InHouseAd? _bannerAd;
@override
void initState() {
super.initState();
_loadAds();
}
Future<void> _loadAds() async {
final native = await InHouseAdRepository.pickForSlot('home_0');
final banner = await InHouseAdRepository.pickForSlot('banner_0');
if (!mounted) return;
setState(() {
_nativeAd = native;
_bannerAd = banner;
});
}
Future<void> _showInterstitial() async {
final ad = await InHouseAdRepository.pickNext();
if (ad == null || !mounted) return;
await InHouseInterstitial.show(context: context, ad: ad, onComplete: () {});
}
Future<void> _showRewarded() async {
final ad = await InHouseAdRepository.pickNextRewarded();
if (ad == null || !mounted) return;
var earned = false;
await InHouseRewarded.show(
context: context,
ad: ad,
onUserEarnedReward: () {
earned = true;
},
onAdDismissed: () {
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
earned ? 'Reward earned!' : 'Ad closed — no reward granted.',
),
),
);
},
);
}
@override
Widget build(BuildContext context) {
final nativeAd = _nativeAd;
final bannerAd = _bannerAd;
return Scaffold(
appBar: AppBar(title: const Text('in_house_ads example')),
body: ListView(
padding: const EdgeInsets.all(16),
children: [
const Text(
'Banner ad slot',
style: TextStyle(fontSize: 18, fontWeight: FontWeight.w600),
),
const SizedBox(height: 12),
if (bannerAd == null)
const Text('No ad available (check apps.json).')
else
InHouseBannerAdView(ad: bannerAd),
const SizedBox(height: 24),
const Text(
'Native ad slot',
style: TextStyle(fontSize: 18, fontWeight: FontWeight.w600),
),
const SizedBox(height: 12),
if (nativeAd == null)
const Text('No ad available (check apps.json).')
else
InHouseNativeAdView(ad: nativeAd),
const SizedBox(height: 24),
FilledButton(
onPressed: _showInterstitial,
child: const Text('Show interstitial'),
),
const SizedBox(height: 12),
FilledButton(
onPressed: _showRewarded,
child: const Text('Show rewarded'),
),
],
),
);
}
}