From a1b7a3ef285185c1694a8aad545b49901ce34adf Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Wed, 8 Oct 2025 14:43:03 +0200 Subject: [PATCH] NEW: MIH Banner Ads Provider Set Up --- Frontend/lib/main.dart | 4 + .../mih_package_components/mih_banner_ad.dart | 78 +++++-------------- .../mih_providers/mih_banner_ad_provider.dart | 50 ++++++++++++ .../calculator/mih_calculator.dart | 10 +++ .../package_tools/currency_exchange_rate.dart | 11 +-- .../calculator/package_tools/tip_calc.dart | 11 +-- .../builder/build_loyalty_card_list.dart | 11 ++- .../mzansi_wallet/mih_wallet.dart | 2 + .../package_tools/mih_card_favourites.dart | 10 --- .../package_tools/mih_cards.dart | 9 --- 10 files changed, 103 insertions(+), 93 deletions(-) create mode 100644 Frontend/lib/mih_components/mih_providers/mih_banner_ad_provider.dart diff --git a/Frontend/lib/main.dart b/Frontend/lib/main.dart index d8c06955..4cf0b810 100644 --- a/Frontend/lib/main.dart +++ b/Frontend/lib/main.dart @@ -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 { ChangeNotifierProvider( create: (context) => MzansiWalletProvider(), ), + ChangeNotifierProvider( + create: (context) => MihBannerAdProvider(), + ), ], child: MaterialApp.router( title: getTitle(), diff --git a/Frontend/lib/mih_components/mih_package_components/mih_banner_ad.dart b/Frontend/lib/mih_components/mih_package_components/mih_banner_ad.dart index 521b3f88..8c52c32c 100644 --- a/Frontend/lib/mih_components/mih_package_components/mih_banner_ad.dart +++ b/Frontend/lib/mih_components/mih_package_components/mih_banner_ad.dart @@ -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 { - 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( + 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 + : ""), + ), + ], + ); + }, ); } } diff --git a/Frontend/lib/mih_components/mih_providers/mih_banner_ad_provider.dart b/Frontend/lib/mih_components/mih_providers/mih_banner_ad_provider.dart new file mode 100644 index 00000000..610c5697 --- /dev/null +++ b/Frontend/lib/mih_components/mih_providers/mih_banner_ad_provider.dart @@ -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(); + } +} diff --git a/Frontend/lib/mih_packages/calculator/mih_calculator.dart b/Frontend/lib/mih_packages/calculator/mih_calculator.dart index cf52264f..01a9f860 100644 --- a/Frontend/lib/mih_packages/calculator/mih_calculator.dart +++ b/Frontend/lib/mih_packages/calculator/mih_calculator.dart @@ -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 { int _selectedIndex = 0; + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) async { + context.read().loadBannerAd(); + }); + } + @override Widget build(BuildContext context) { return MihPackage( diff --git a/Frontend/lib/mih_packages/calculator/package_tools/currency_exchange_rate.dart b/Frontend/lib/mih_packages/calculator/package_tools/currency_exchange_rate.dart index a91104ec..2cd27f3f 100644 --- a/Frontend/lib/mih_packages/calculator/package_tools/currency_exchange_rate.dart +++ b/Frontend/lib/mih_packages/calculator/package_tools/currency_exchange_rate.dart @@ -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 { final TextEditingController _fromAmountController = TextEditingController(); final TextEditingController _toAmountController = TextEditingController(); late Future> availableCurrencies; - MihBannerAd _bannerAd = MihBannerAd(); Future submitForm() async { String fromCurrencyCode = _fromCurrencyController.text.split(" - ")[0]; @@ -67,9 +68,7 @@ class _CurrencyExchangeRateState extends State { fullscreen: false, windowTitle: "Calculation Results", onWindowTapClose: () { - setState(() { - _bannerAd = MihBannerAd(); - }); + context.read().loadBannerAd(); Navigator.pop(context); }, windowBody: Column( @@ -160,7 +159,9 @@ class _CurrencyExchangeRateState extends State { ], ), SizedBox(height: 10), - SizedBox(child: _bannerAd), + Consumer(builder: (context, bannerAdDisplay, child) { + return MihBannerAd(); + }), ], ), ), diff --git a/Frontend/lib/mih_packages/calculator/package_tools/tip_calc.dart b/Frontend/lib/mih_packages/calculator/package_tools/tip_calc.dart index f9269868..229dbd1e 100644 --- a/Frontend/lib/mih_packages/calculator/package_tools/tip_calc.dart +++ b/Frontend/lib/mih_packages/calculator/package_tools/tip_calc.dart @@ -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 { final ValueNotifier splitValue = ValueNotifier(""); late bool splitPosition; final _formKey = GlobalKey(); - MihBannerAd _bannerAd = MihBannerAd(); String tip = ""; String total = ""; String amountPerPerson = ""; @@ -98,9 +99,7 @@ class _TipCalcState extends State { fullscreen: false, windowTitle: "Calculation Results", onWindowTapClose: () { - setState(() { - _bannerAd = MihBannerAd(); - }); + context.read().loadBannerAd(); Navigator.pop(context); }, windowBody: Column( @@ -231,7 +230,9 @@ class _TipCalcState extends State { ), ), SizedBox(height: 10), - SizedBox(child: _bannerAd), + Consumer(builder: (context, bannerAdDisplay, child) { + return MihBannerAd(); + }), // if (splitBillController.text == "Yes") const Divider(), ], ), diff --git a/Frontend/lib/mih_packages/mzansi_wallet/builder/build_loyalty_card_list.dart b/Frontend/lib/mih_packages/mzansi_wallet/builder/build_loyalty_card_list.dart index 9e70cd87..90ea7719 100644 --- a/Frontend/lib/mih_packages/mzansi_wallet/builder/build_loyalty_card_list.dart +++ b/Frontend/lib/mih_packages/mzansi_wallet/builder/build_loyalty_card_list.dart @@ -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 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 { ), ], onWindowTapClose: () { - widget.onCardViewClose; + context.read().loadBannerAd(); resetScreenBrightness(); context.pop(); }, @@ -549,7 +546,9 @@ class _BuildLoyaltyCardListState extends State { ), ), SizedBox(height: 10), - widget.bannerAd ?? SizedBox(), + Consumer(builder: (context, bannerAdDisplay, child) { + return MihBannerAd(); + }), // MihBannerAd(), ], ), diff --git a/Frontend/lib/mih_packages/mzansi_wallet/mih_wallet.dart b/Frontend/lib/mih_packages/mzansi_wallet/mih_wallet.dart index 7392b322..60d3c0e2 100644 --- a/Frontend/lib/mih_packages/mzansi_wallet/mih_wallet.dart +++ b/Frontend/lib/mih_packages/mzansi_wallet/mih_wallet.dart @@ -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 { setPackageIndex(); await setLoyaltyCards(); await setFavouritesCards(); + context.read().loadBannerAd(); setState(() { isLoading = false; }); diff --git a/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_card_favourites.dart b/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_card_favourites.dart index af483d2d..1d1a19c2 100644 --- a/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_card_favourites.dart +++ b/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_card_favourites.dart @@ -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 { late Future> cardList; - late MihBannerAd _bannerAd; List listOfCards = []; void getFavouriteLoyaltyCards(BuildContext context) async { @@ -32,7 +30,6 @@ class _MihCardFavouritesState extends State { @override void initState() { - _bannerAd = MihBannerAd(); getFavouriteLoyaltyCards(context); super.initState(); } @@ -55,15 +52,8 @@ class _MihCardFavouritesState extends State { cardList: listOfCards, signedInUser: widget.signedInUser, navIndex: 0, - bannerAd: _bannerAd, favouritesMode: true, searchText: TextEditingController(), - onCardViewClose: () { - setState(() { - _bannerAd = MihBannerAd(); - }); - Navigator.pop(context); - }, ), ], ), diff --git a/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_cards.dart b/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_cards.dart index 26bf46a7..32658638 100644 --- a/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_cards.dart +++ b/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_cards.dart @@ -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 { final TextEditingController cardSearchController = TextEditingController(); final FocusNode searchFocusNode = FocusNode(); - MihBannerAd _bannerAd = MihBannerAd(); List listOfCards = []; final ValueNotifier> searchShopName = ValueNotifier([]); final MobileScannerController scannerController = MobileScannerController( @@ -202,15 +200,8 @@ class _MihCardsState extends State { cardList: filteredCards, //listOfCards, signedInUser: widget.signedInUser, navIndex: 0, - bannerAd: _bannerAd, favouritesMode: false, searchText: cardSearchController, - onCardViewClose: () { - setState(() { - _bannerAd = MihBannerAd(); - }); - // Navigator.pop(context); - }, ); }); },