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

View File

@@ -1,6 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:google_mobile_ads/google_mobile_ads.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:mzansi_innovation_hub/mih_config/mih_env.dart';
import 'package:provider/provider.dart';
class MihBannerAd extends StatefulWidget { class MihBannerAd extends StatefulWidget {
const MihBannerAd({super.key}); const MihBannerAd({super.key});
@@ -10,66 +12,26 @@ class MihBannerAd extends StatefulWidget {
} }
class _MihBannerAdState extends State<MihBannerAd> { 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column( return Consumer<MihBannerAdProvider>(
children: [ builder: (context, bannerAdProvider, child) {
_bannerAd != null && _isBannerAdLoaded return Column(
? SizedBox( children: [
width: _bannerAd!.size.width.toDouble(), bannerAdProvider.bannerAd != null &&
height: _bannerAd!.size.height.toDouble(), bannerAdProvider.isBannerAdLoaded
child: AdWidget(ad: _bannerAd!)) ? SizedBox(
: SizedBox( width: bannerAdProvider.bannerAd!.size.width.toDouble(),
child: height: bannerAdProvider.bannerAd!.size.height.toDouble(),
Text(AppEnviroment.getEnv() == "Dev" ? errorMessage : ""), 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.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_action.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tools.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/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/simple_calc.dart';
import 'package:mzansi_innovation_hub/mih_packages/calculator/package_tools/tip_calc.dart'; import 'package:mzansi_innovation_hub/mih_packages/calculator/package_tools/tip_calc.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class MIHCalculator extends StatefulWidget { class MIHCalculator extends StatefulWidget {
final bool personalSelected; final bool personalSelected;
@@ -21,6 +23,14 @@ class MIHCalculator extends StatefulWidget {
class _MIHCalculatorState extends State<MIHCalculator> { class _MIHCalculatorState extends State<MIHCalculator> {
int _selectedIndex = 0; int _selectedIndex = 0;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) async {
context.read<MihBannerAdProvider>().loadBannerAd();
});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MihPackage( 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_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_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_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_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.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_currency_exchange_rate_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart';
import 'package:provider/provider.dart';
class CurrencyExchangeRate extends StatefulWidget { class CurrencyExchangeRate extends StatefulWidget {
const CurrencyExchangeRate({super.key}); const CurrencyExchangeRate({super.key});
@@ -29,7 +31,6 @@ class _CurrencyExchangeRateState extends State<CurrencyExchangeRate> {
final TextEditingController _fromAmountController = TextEditingController(); final TextEditingController _fromAmountController = TextEditingController();
final TextEditingController _toAmountController = TextEditingController(); final TextEditingController _toAmountController = TextEditingController();
late Future<List<String>> availableCurrencies; late Future<List<String>> availableCurrencies;
MihBannerAd _bannerAd = MihBannerAd();
Future<void> submitForm() async { Future<void> submitForm() async {
String fromCurrencyCode = _fromCurrencyController.text.split(" - ")[0]; String fromCurrencyCode = _fromCurrencyController.text.split(" - ")[0];
@@ -67,9 +68,7 @@ class _CurrencyExchangeRateState extends State<CurrencyExchangeRate> {
fullscreen: false, fullscreen: false,
windowTitle: "Calculation Results", windowTitle: "Calculation Results",
onWindowTapClose: () { onWindowTapClose: () {
setState(() { context.read<MihBannerAdProvider>().loadBannerAd();
_bannerAd = MihBannerAd();
});
Navigator.pop(context); Navigator.pop(context);
}, },
windowBody: Column( windowBody: Column(
@@ -160,7 +159,9 @@ class _CurrencyExchangeRateState extends State<CurrencyExchangeRate> {
], ],
), ),
SizedBox(height: 10), 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/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_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_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_validation_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:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:math_expressions/math_expressions.dart'; import 'package:math_expressions/math_expressions.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_toggle.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_toggle.dart';
import 'package:provider/provider.dart';
class TipCalc extends StatefulWidget { class TipCalc extends StatefulWidget {
const TipCalc({super.key}); const TipCalc({super.key});
@@ -30,7 +32,6 @@ class _TipCalcState extends State<TipCalc> {
final ValueNotifier<String> splitValue = ValueNotifier(""); final ValueNotifier<String> splitValue = ValueNotifier("");
late bool splitPosition; late bool splitPosition;
final _formKey = GlobalKey<FormState>(); final _formKey = GlobalKey<FormState>();
MihBannerAd _bannerAd = MihBannerAd();
String tip = ""; String tip = "";
String total = ""; String total = "";
String amountPerPerson = ""; String amountPerPerson = "";
@@ -98,9 +99,7 @@ class _TipCalcState extends State<TipCalc> {
fullscreen: false, fullscreen: false,
windowTitle: "Calculation Results", windowTitle: "Calculation Results",
onWindowTapClose: () { onWindowTapClose: () {
setState(() { context.read<MihBannerAdProvider>().loadBannerAd();
_bannerAd = MihBannerAd();
});
Navigator.pop(context); Navigator.pop(context);
}, },
windowBody: Column( windowBody: Column(
@@ -231,7 +230,9 @@ class _TipCalcState extends State<TipCalc> {
), ),
), ),
SizedBox(height: 10), SizedBox(height: 10),
SizedBox(child: _bannerAd), Consumer(builder: (context, bannerAdDisplay, child) {
return MihBannerAd();
}),
// if (splitBillController.text == "Yes") const Divider(), // 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_banner_ad.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.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_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_components/mih_providers/mzansi_wallet_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.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_alert_services.dart';
@@ -29,10 +30,8 @@ class BuildLoyaltyCardList extends StatefulWidget {
final AppUser signedInUser; final AppUser signedInUser;
final List<MIHLoyaltyCard> cardList; final List<MIHLoyaltyCard> cardList;
final int navIndex; final int navIndex;
final MihBannerAd? bannerAd;
final bool favouritesMode; final bool favouritesMode;
final TextEditingController searchText; final TextEditingController searchText;
final void Function()? onCardViewClose;
const BuildLoyaltyCardList({ const BuildLoyaltyCardList({
super.key, super.key,
@@ -41,8 +40,6 @@ class BuildLoyaltyCardList extends StatefulWidget {
required this.navIndex, required this.navIndex,
required this.favouritesMode, required this.favouritesMode,
required this.searchText, required this.searchText,
this.bannerAd,
this.onCardViewClose,
}); });
@override @override
@@ -487,7 +484,7 @@ class _BuildLoyaltyCardListState extends State<BuildLoyaltyCardList> {
), ),
], ],
onWindowTapClose: () { onWindowTapClose: () {
widget.onCardViewClose; context.read<MihBannerAdProvider>().loadBannerAd();
resetScreenBrightness(); resetScreenBrightness();
context.pop(); context.pop();
}, },
@@ -549,7 +546,9 @@ class _BuildLoyaltyCardListState extends State<BuildLoyaltyCardList> {
), ),
), ),
SizedBox(height: 10), SizedBox(height: 10),
widget.bannerAd ?? SizedBox(), Consumer(builder: (context, bannerAdDisplay, child) {
return MihBannerAd();
}),
// 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_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_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_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:mzansi_innovation_hub/mih_components/mih_providers/mzansi_wallet_provider.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_wallet/package_tools/mih_card_favourites.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(); setPackageIndex();
await setLoyaltyCards(); await setLoyaltyCards();
await setFavouritesCards(); await setFavouritesCards();
context.read<MihBannerAdProvider>().loadBannerAd();
setState(() { setState(() {
isLoading = false; isLoading = false;
}); });

View File

@@ -1,5 +1,4 @@
import 'package:flutter/material.dart'; 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_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_single_child_scroll.dart';
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_package_tool_body.dart';
@@ -21,7 +20,6 @@ class MihCardFavourites extends StatefulWidget {
class _MihCardFavouritesState extends State<MihCardFavourites> { class _MihCardFavouritesState extends State<MihCardFavourites> {
late Future<List<MIHLoyaltyCard>> cardList; late Future<List<MIHLoyaltyCard>> cardList;
late MihBannerAd _bannerAd;
List<MIHLoyaltyCard> listOfCards = []; List<MIHLoyaltyCard> listOfCards = [];
void getFavouriteLoyaltyCards(BuildContext context) async { void getFavouriteLoyaltyCards(BuildContext context) async {
@@ -32,7 +30,6 @@ class _MihCardFavouritesState extends State<MihCardFavourites> {
@override @override
void initState() { void initState() {
_bannerAd = MihBannerAd();
getFavouriteLoyaltyCards(context); getFavouriteLoyaltyCards(context);
super.initState(); super.initState();
} }
@@ -55,15 +52,8 @@ class _MihCardFavouritesState extends State<MihCardFavourites> {
cardList: listOfCards, cardList: listOfCards,
signedInUser: widget.signedInUser, signedInUser: widget.signedInUser,
navIndex: 0, navIndex: 0,
bannerAd: _bannerAd,
favouritesMode: true, favouritesMode: true,
searchText: TextEditingController(), 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:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:mzansi_innovation_hub/main.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_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_components/mih_providers/mzansi_wallet_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
@@ -33,7 +32,6 @@ class MihCards extends StatefulWidget {
class _MihCardsState extends State<MihCards> { class _MihCardsState extends State<MihCards> {
final TextEditingController cardSearchController = TextEditingController(); final TextEditingController cardSearchController = TextEditingController();
final FocusNode searchFocusNode = FocusNode(); final FocusNode searchFocusNode = FocusNode();
MihBannerAd _bannerAd = MihBannerAd();
List<MIHLoyaltyCard> listOfCards = []; List<MIHLoyaltyCard> listOfCards = [];
final ValueNotifier<List<MIHLoyaltyCard>> searchShopName = ValueNotifier([]); final ValueNotifier<List<MIHLoyaltyCard>> searchShopName = ValueNotifier([]);
final MobileScannerController scannerController = MobileScannerController( final MobileScannerController scannerController = MobileScannerController(
@@ -202,15 +200,8 @@ class _MihCardsState extends State<MihCards> {
cardList: filteredCards, //listOfCards, cardList: filteredCards, //listOfCards,
signedInUser: widget.signedInUser, signedInUser: widget.signedInUser,
navIndex: 0, navIndex: 0,
bannerAd: _bannerAd,
favouritesMode: false, favouritesMode: false,
searchText: cardSearchController, searchText: cardSearchController,
onCardViewClose: () {
setState(() {
_bannerAd = MihBannerAd();
});
// Navigator.pop(context);
},
); );
}); });
}, },