NEW: MIH Banner Ads Provider Set Up

This commit is contained in:
2025-10-08 14:43:03 +02:00
parent 7373a1b8cb
commit a1b7a3ef28
10 changed files with 103 additions and 93 deletions

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_banner_ad_provider.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_wallet_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:provider/provider.dart';
@@ -73,6 +74,9 @@ class _MzansiInnovationHubState extends State<MzansiInnovationHub> {
ChangeNotifierProvider(
create: (context) => MzansiWalletProvider(),
),
ChangeNotifierProvider(
create: (context) => MihBannerAdProvider(),
),
],
child: MaterialApp.router(
title: getTitle(),

View File

@@ -1,6 +1,8 @@
import 'package:flutter/material.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_banner_ad_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_env.dart';
import 'package:provider/provider.dart';
class MihBannerAd extends StatefulWidget {
const MihBannerAd({super.key});
@@ -10,66 +12,26 @@ class MihBannerAd extends StatefulWidget {
}
class _MihBannerAdState extends State<MihBannerAd> {
BannerAd? _bannerAd;
bool _isBannerAdLoaded = false;
final adUnitId = AppEnviroment.bannerAdUnitId;
String errorMessage = '';
void _loadBannerAd() {
_bannerAd = BannerAd(
adUnitId: adUnitId,
request: const AdRequest(),
size: AdSize.banner,
listener: BannerAdListener(
onAdLoaded: (ad) {
debugPrint('$ad loaded.');
setState(() {
_isBannerAdLoaded = true;
});
},
onAdFailedToLoad: (ad, err) {
debugPrint('BannerAd failed to load: $err');
setState(() {
errorMessage =
'Failed to load ad- Message: ${err.message} Code :${err.code}';
});
ad.dispose(); // Dispose the ad to free resources
},
onAdOpened: (Ad ad) => debugPrint('$ad opened.'),
onAdClosed: (Ad ad) => debugPrint('$ad closed.'),
onAdImpression: (Ad ad) => debugPrint('$ad impression.'),
),
);
_bannerAd!.load();
}
@override
void dispose() {
_bannerAd?.dispose(); // Dispose the ad when the widget is removed
super.dispose();
}
@override
void initState() {
super.initState();
_loadBannerAd();
}
@override
Widget build(BuildContext context) {
return Column(
children: [
_bannerAd != null && _isBannerAdLoaded
? SizedBox(
width: _bannerAd!.size.width.toDouble(),
height: _bannerAd!.size.height.toDouble(),
child: AdWidget(ad: _bannerAd!))
: SizedBox(
child:
Text(AppEnviroment.getEnv() == "Dev" ? errorMessage : ""),
),
],
return Consumer<MihBannerAdProvider>(
builder: (context, bannerAdProvider, child) {
return Column(
children: [
bannerAdProvider.bannerAd != null &&
bannerAdProvider.isBannerAdLoaded
? SizedBox(
width: bannerAdProvider.bannerAd!.size.width.toDouble(),
height: bannerAdProvider.bannerAd!.size.height.toDouble(),
child: AdWidget(ad: bannerAdProvider.bannerAd!))
: SizedBox(
child: Text(AppEnviroment.getEnv() == "Dev"
? bannerAdProvider.errorMessage
: ""),
),
],
);
},
);
}
}

View File

@@ -0,0 +1,50 @@
import 'package:flutter/foundation.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_env.dart';
class MihBannerAdProvider extends ChangeNotifier {
BannerAd? bannerAd;
final adUnitId = AppEnviroment.bannerAdUnitId;
bool isBannerAdLoaded = false;
String errorMessage = '';
MihBannerAdProvider({
this.bannerAd,
this.isBannerAdLoaded = false,
this.errorMessage = '',
});
@override
void dispose() {
bannerAd?.dispose();
super.dispose();
}
void loadBannerAd() {
bannerAd = BannerAd(
adUnitId: adUnitId,
request: const AdRequest(),
size: AdSize.banner,
listener: BannerAdListener(
onAdLoaded: (ad) {
debugPrint('$ad loaded.');
isBannerAdLoaded = true;
notifyListeners();
},
onAdFailedToLoad: (ad, err) {
debugPrint('BannerAd failed to load: $err');
errorMessage =
'Failed to load ad- Message: ${err.message} Code :${err.code}';
ad.dispose(); // Dispose the ad to free resources
isBannerAdLoaded = false; // ⬅️ Explicitly set to false
bannerAd = null; // ⬅️ Explicitly set to null
notifyListeners();
},
onAdOpened: (Ad ad) => debugPrint('$ad opened.'),
onAdClosed: (Ad ad) => debugPrint('$ad closed.'),
onAdImpression: (Ad ad) => debugPrint('$ad impression.'),
),
);
bannerAd!.load();
}
}

View File

@@ -2,10 +2,12 @@ import 'package:go_router/go_router.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_action.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tools.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_banner_ad_provider.dart';
import 'package:mzansi_innovation_hub/mih_packages/calculator/package_tools/currency_exchange_rate.dart';
import 'package:mzansi_innovation_hub/mih_packages/calculator/package_tools/simple_calc.dart';
import 'package:mzansi_innovation_hub/mih_packages/calculator/package_tools/tip_calc.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class MIHCalculator extends StatefulWidget {
final bool personalSelected;
@@ -21,6 +23,14 @@ class MIHCalculator extends StatefulWidget {
class _MIHCalculatorState extends State<MIHCalculator> {
int _selectedIndex = 0;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) async {
context.read<MihBannerAdProvider>().loadBannerAd();
});
}
@override
Widget build(BuildContext context) {
return MihPackage(

View File

@@ -10,10 +10,12 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_single_child_scroll.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_text_form_field.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_banner_ad_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_currency_exchange_rate_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart';
import 'package:provider/provider.dart';
class CurrencyExchangeRate extends StatefulWidget {
const CurrencyExchangeRate({super.key});
@@ -29,7 +31,6 @@ class _CurrencyExchangeRateState extends State<CurrencyExchangeRate> {
final TextEditingController _fromAmountController = TextEditingController();
final TextEditingController _toAmountController = TextEditingController();
late Future<List<String>> availableCurrencies;
MihBannerAd _bannerAd = MihBannerAd();
Future<void> submitForm() async {
String fromCurrencyCode = _fromCurrencyController.text.split(" - ")[0];
@@ -67,9 +68,7 @@ class _CurrencyExchangeRateState extends State<CurrencyExchangeRate> {
fullscreen: false,
windowTitle: "Calculation Results",
onWindowTapClose: () {
setState(() {
_bannerAd = MihBannerAd();
});
context.read<MihBannerAdProvider>().loadBannerAd();
Navigator.pop(context);
},
windowBody: Column(
@@ -160,7 +159,9 @@ class _CurrencyExchangeRateState extends State<CurrencyExchangeRate> {
],
),
SizedBox(height: 10),
SizedBox(child: _bannerAd),
Consumer(builder: (context, bannerAdDisplay, child) {
return MihBannerAd();
}),
],
),
),

View File

@@ -1,5 +1,6 @@
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_banner_ad.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_banner_ad_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart';
@@ -14,6 +15,7 @@ import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:math_expressions/math_expressions.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_toggle.dart';
import 'package:provider/provider.dart';
class TipCalc extends StatefulWidget {
const TipCalc({super.key});
@@ -30,7 +32,6 @@ class _TipCalcState extends State<TipCalc> {
final ValueNotifier<String> splitValue = ValueNotifier("");
late bool splitPosition;
final _formKey = GlobalKey<FormState>();
MihBannerAd _bannerAd = MihBannerAd();
String tip = "";
String total = "";
String amountPerPerson = "";
@@ -98,9 +99,7 @@ class _TipCalcState extends State<TipCalc> {
fullscreen: false,
windowTitle: "Calculation Results",
onWindowTapClose: () {
setState(() {
_bannerAd = MihBannerAd();
});
context.read<MihBannerAdProvider>().loadBannerAd();
Navigator.pop(context);
},
windowBody: Column(
@@ -231,7 +230,9 @@ class _TipCalcState extends State<TipCalc> {
),
),
SizedBox(height: 10),
SizedBox(child: _bannerAd),
Consumer(builder: (context, bannerAdDisplay, child) {
return MihBannerAd();
}),
// if (splitBillController.text == "Yes") const Divider(),
],
),

View File

@@ -6,6 +6,7 @@ import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_banner_ad.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_banner_ad_provider.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_wallet_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart';
@@ -29,10 +30,8 @@ class BuildLoyaltyCardList extends StatefulWidget {
final AppUser signedInUser;
final List<MIHLoyaltyCard> cardList;
final int navIndex;
final MihBannerAd? bannerAd;
final bool favouritesMode;
final TextEditingController searchText;
final void Function()? onCardViewClose;
const BuildLoyaltyCardList({
super.key,
@@ -41,8 +40,6 @@ class BuildLoyaltyCardList extends StatefulWidget {
required this.navIndex,
required this.favouritesMode,
required this.searchText,
this.bannerAd,
this.onCardViewClose,
});
@override
@@ -487,7 +484,7 @@ class _BuildLoyaltyCardListState extends State<BuildLoyaltyCardList> {
),
],
onWindowTapClose: () {
widget.onCardViewClose;
context.read<MihBannerAdProvider>().loadBannerAd();
resetScreenBrightness();
context.pop();
},
@@ -549,7 +546,9 @@ class _BuildLoyaltyCardListState extends State<BuildLoyaltyCardList> {
),
),
SizedBox(height: 10),
widget.bannerAd ?? SizedBox(),
Consumer(builder: (context, bannerAdDisplay, child) {
return MihBannerAd();
}),
// MihBannerAd(),
],
),

View File

@@ -4,6 +4,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tools.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_banner_ad_provider.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_wallet_provider.dart';
import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_wallet/package_tools/mih_card_favourites.dart';
@@ -48,6 +49,7 @@ class _MihWalletState extends State<MihWallet> {
setPackageIndex();
await setLoyaltyCards();
await setFavouritesCards();
context.read<MihBannerAdProvider>().loadBannerAd();
setState(() {
isLoading = false;
});

View File

@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_banner_ad.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_wallet_provider.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_single_child_scroll.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tool_body.dart';
@@ -21,7 +20,6 @@ class MihCardFavourites extends StatefulWidget {
class _MihCardFavouritesState extends State<MihCardFavourites> {
late Future<List<MIHLoyaltyCard>> cardList;
late MihBannerAd _bannerAd;
List<MIHLoyaltyCard> listOfCards = [];
void getFavouriteLoyaltyCards(BuildContext context) async {
@@ -32,7 +30,6 @@ class _MihCardFavouritesState extends State<MihCardFavourites> {
@override
void initState() {
_bannerAd = MihBannerAd();
getFavouriteLoyaltyCards(context);
super.initState();
}
@@ -55,15 +52,8 @@ class _MihCardFavouritesState extends State<MihCardFavourites> {
cardList: listOfCards,
signedInUser: widget.signedInUser,
navIndex: 0,
bannerAd: _bannerAd,
favouritesMode: true,
searchText: TextEditingController(),
onCardViewClose: () {
setState(() {
_bannerAd = MihBannerAd();
});
Navigator.pop(context);
},
),
],
),

View File

@@ -1,7 +1,6 @@
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:go_router/go_router.dart';
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_banner_ad.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_alert.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_wallet_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
@@ -33,7 +32,6 @@ class MihCards extends StatefulWidget {
class _MihCardsState extends State<MihCards> {
final TextEditingController cardSearchController = TextEditingController();
final FocusNode searchFocusNode = FocusNode();
MihBannerAd _bannerAd = MihBannerAd();
List<MIHLoyaltyCard> listOfCards = [];
final ValueNotifier<List<MIHLoyaltyCard>> searchShopName = ValueNotifier([]);
final MobileScannerController scannerController = MobileScannerController(
@@ -202,15 +200,8 @@ class _MihCardsState extends State<MihCards> {
cardList: filteredCards, //listOfCards,
signedInUser: widget.signedInUser,
navIndex: 0,
bannerAd: _bannerAd,
favouritesMode: false,
searchText: cardSearchController,
onCardViewClose: () {
setState(() {
_bannerAd = MihBannerAd();
});
// Navigator.pop(context);
},
);
});
},