From ba46f38497ad757f590140a13eec99ccd37d5497 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Mon, 3 Nov 2025 11:27:44 +0200 Subject: [PATCH] BUG: MIH Ad Display Strategy --- .../mih_package_components/mih_banner_ad.dart | 18 ++++++++ .../mih_providers/mih_banner_ad_provider.dart | 5 +++ .../calculator/mih_calculator.dart | 2 - .../package_tools/currency_exchange_rate.dart | 2 - .../calculator/package_tools/tip_calc.dart | 2 - .../package_tools/mine_sweeper_game.dart | 44 ++++++------------- .../builder/build_loyalty_card_list.dart | 6 +-- .../mzansi_wallet/mih_wallet.dart | 2 - .../package_tools/mih_cards.dart | 18 ++++---- 9 files changed, 47 insertions(+), 52 deletions(-) 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 8c52c32c..61abe627 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 @@ -12,10 +12,28 @@ class MihBannerAd extends StatefulWidget { } class _MihBannerAdState extends State { + @override + void dispose() { + super.dispose(); + } + + @override + void initState() { + super.initState(); + MihBannerAdProvider adProvider = context.read(); + WidgetsBinding.instance.addPostFrameCallback((_) { + adProvider.reset(); + adProvider.loadBannerAd(); + }); + } + @override Widget build(BuildContext context) { return Consumer( builder: (context, bannerAdProvider, child) { + if (!bannerAdProvider.isBannerAdLoaded) { + return SizedBox(); + } return Column( children: [ bannerAdProvider.bannerAd != null && 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 index 560fc91a..394bcbb4 100644 --- a/Frontend/lib/mih_components/mih_providers/mih_banner_ad_provider.dart +++ b/Frontend/lib/mih_components/mih_providers/mih_banner_ad_provider.dart @@ -28,6 +28,11 @@ class MihBannerAdProvider extends ChangeNotifier { } void loadBannerAd() { + if (bannerAd != null) { + bannerAd!.dispose(); + bannerAd = null; + isBannerAdLoaded = false; + } bannerAd = BannerAd( adUnitId: adUnitId, request: const AdRequest(), diff --git a/Frontend/lib/mih_packages/calculator/mih_calculator.dart b/Frontend/lib/mih_packages/calculator/mih_calculator.dart index e0ed5add..775a868e 100644 --- a/Frontend/lib/mih_packages/calculator/mih_calculator.dart +++ b/Frontend/lib/mih_packages/calculator/mih_calculator.dart @@ -2,7 +2,6 @@ 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_components/mih_providers/mih_calculator_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'; @@ -29,7 +28,6 @@ class _MIHCalculatorState extends State { void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) async { - context.read().loadBannerAd(); await getCurrencyCodeList(); }); } 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 b0680632..6fabe709 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 @@ -9,7 +9,6 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_window.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_text_form_field.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_banner_ad_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_calculator_provider.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; @@ -67,7 +66,6 @@ class _CurrencyExchangeRateState extends State { fullscreen: false, windowTitle: "Calculation Results", onWindowTapClose: () { - context.read().loadBannerAd(); Navigator.pop(context); }, windowBody: Column( 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 229dbd1e..58583291 100644 --- a/Frontend/lib/mih_packages/calculator/package_tools/tip_calc.dart +++ b/Frontend/lib/mih_packages/calculator/package_tools/tip_calc.dart @@ -1,6 +1,5 @@ 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'; @@ -99,7 +98,6 @@ class _TipCalcState extends State { fullscreen: false, windowTitle: "Calculation Results", onWindowTapClose: () { - context.read().loadBannerAd(); Navigator.pop(context); }, windowBody: Column( diff --git a/Frontend/lib/mih_packages/mine_sweeper/package_tools/mine_sweeper_game.dart b/Frontend/lib/mih_packages/mine_sweeper/package_tools/mine_sweeper_game.dart index 3facf977..59632f77 100644 --- a/Frontend/lib/mih_packages/mine_sweeper/package_tools/mine_sweeper_game.dart +++ b/Frontend/lib/mih_packages/mine_sweeper/package_tools/mine_sweeper_game.dart @@ -13,7 +13,6 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tool_body.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_single_child_scroll.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/mih_mine_sweeper_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; @@ -124,8 +123,9 @@ class _MineSweeperGameState extends State { return '$hoursStr:$minutesStr:$secondsStr:$centiStr'; } - void showStartGameWindow(MihMineSweeperProvider mihMineSweeperProvider, - MihBannerAdProvider addProvider) { + void showStartGameWindow( + MihMineSweeperProvider mihMineSweeperProvider, + ) { // easy - 10 * 10 & 15 bombs // Intermediate - 10 * 15 & 23 bombs // Hard - 10 * 20 & 30 bombs @@ -134,7 +134,6 @@ class _MineSweeperGameState extends State { builder: (context) { return MihMineSweeperStartGameWindow( onPressed: () { - addProvider.loadBannerAd(); resetTimer(); mihMineSweeperProvider .setDifficulty(mihMineSweeperProvider.difficulty); @@ -241,12 +240,8 @@ class _MineSweeperGameState extends State { } } - Future handleTap( - MzansiProfileProvider profileProvider, - MihMineSweeperProvider mihMineSweeperProvider, - MihBannerAdProvider adProvider, - int r, - int c) async { + Future handleTap(MzansiProfileProvider profileProvider, + MihMineSweeperProvider mihMineSweeperProvider, int r, int c) async { if (isGameOver || board[r][c].isOpened || board[r][c].isFlagged) { return; } @@ -304,8 +299,7 @@ class _MineSweeperGameState extends State { MihButton( onPressed: () { context.pop(); - showStartGameWindow( - mihMineSweeperProvider, adProvider); + showStartGameWindow(mihMineSweeperProvider); }, buttonColor: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == @@ -364,7 +358,7 @@ class _MineSweeperGameState extends State { squaresLeft--; } // 3. Check for win - _checkWinCondition(profileProvider, mihMineSweeperProvider, adProvider); + _checkWinCondition(profileProvider, mihMineSweeperProvider); // Update the UI setState(() {}); } @@ -383,7 +377,6 @@ class _MineSweeperGameState extends State { Future _checkWinCondition( MzansiProfileProvider profileProvider, MihMineSweeperProvider mihMineSweeperProvider, - MihBannerAdProvider adProvider, ) async { // Game is won if all non-mine squares are opened. if (squaresLeft <= mihMineSweeperProvider.totalMines) { @@ -450,7 +443,7 @@ class _MineSweeperGameState extends State { MihButton( onPressed: () { context.pop(); - showStartGameWindow(mihMineSweeperProvider, adProvider); + showStartGameWindow(mihMineSweeperProvider); }, buttonColor: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == @@ -558,13 +551,9 @@ class _MineSweeperGameState extends State { } Widget getBody() { - return Consumer3( - builder: (BuildContext context, - MzansiProfileProvider profileProvider, - MihMineSweeperProvider mihMineSweeperProvider, - MihBannerAdProvider adProvider, - Widget? child) { + return Consumer2( + builder: (BuildContext context, MzansiProfileProvider profileProvider, + MihMineSweeperProvider mihMineSweeperProvider, Widget? child) { return Column( children: [ Expanded( @@ -725,12 +714,8 @@ class _MineSweeperGameState extends State { return MineTile( square: board[r][c], - onTap: () => handleTap( - profileProvider, - mihMineSweeperProvider, - adProvider, - r, - c), + onTap: () => handleTap(profileProvider, + mihMineSweeperProvider, r, c), onLongPress: () => handleLongPress(r, c), ); }, @@ -794,8 +779,7 @@ class _MineSweeperGameState extends State { MzansiInnovationHub.of(context)!.theme.mode == "Dark"), onTap: () { - showStartGameWindow( - mihMineSweeperProvider, adProvider); + showStartGameWindow(mihMineSweeperProvider); }, ), ]), 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 11cdb53c..7110a464 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,7 +6,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_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_profile_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'; @@ -522,7 +521,6 @@ class _BuildLoyaltyCardListState extends State { ), ], onWindowTapClose: () { - context.read().loadBannerAd(); resetScreenBrightness(); context.pop(); }, @@ -584,9 +582,7 @@ class _BuildLoyaltyCardListState extends State { ), ), SizedBox(height: 10), - Consumer(builder: (context, bannerAdDisplay, child) { - return MihBannerAd(); - }), + 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 e744a248..1d56e1db 100644 --- a/Frontend/lib/mih_packages/mzansi_wallet/mih_wallet.dart +++ b/Frontend/lib/mih_packages/mzansi_wallet/mih_wallet.dart @@ -3,7 +3,6 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_ 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_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_profile_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_wallet_provider.dart'; import 'package:flutter/material.dart'; @@ -50,7 +49,6 @@ class _MihWalletState extends State { context.read(); await setLoyaltyCards(mzansiProfileProvider, walletProvider); await setFavouritesCards(mzansiProfileProvider, walletProvider); - context.read().loadBannerAd(); setState(() { isLoading = false; }); 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 18f59a8f..65abd81b 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 @@ -34,6 +34,8 @@ class _MihCardsState extends State { detectionSpeed: DetectionSpeed.unrestricted, ); final boxFit = BoxFit.contain; + late MzansiWalletProvider _walletProvider; + late VoidCallback _searchListener; void searchShop(List allCards) { if (cardSearchController.text.isEmpty) { @@ -129,10 +131,7 @@ class _MihCardsState extends State { @override void dispose() { - final walletProvider = context.read(); - cardSearchController.removeListener(() { - searchShop(walletProvider.loyaltyCards); - }); + cardSearchController.removeListener(_searchListener); cardSearchController.dispose(); searchShopName.dispose(); searchFocusNode.dispose(); @@ -141,11 +140,12 @@ class _MihCardsState extends State { @override void initState() { - final walletProvider = context.read(); - searchShopName.value = walletProvider.loyaltyCards; - cardSearchController.addListener(() { - searchShop(walletProvider.loyaltyCards); - }); + _walletProvider = context.read(); + _searchListener = () { + searchShop(_walletProvider.loyaltyCards); + }; + searchShopName.value = _walletProvider.loyaltyCards; + cardSearchController.addListener(_searchListener); super.initState(); }