BannerAd.dispose Flutter Admob 不工作
BannerAd.dispose Not Working Flutter Admob
我目前正在尝试在我的应用程序中显示 admob 横幅,但是有两个页面我不希望显示横幅(目前我只使用设置路由进行测试),并调用处置横幅没有隐藏它。
我尝试了什么:
- 为每个小部件创建横幅并在小部件的
onDispose
方法的覆盖内调用 dispose 方法
- 创建一个广告管理器 class,它创建了横幅并保存了对它的引用,并从所述 class 调用一个函数,该函数在
init
内的横幅上调用 dispose我不希望显示横幅的页面。
- 我当前的解决方案:观察者 class 在推送时显示横幅,如果路由名称与我要查找的名称匹配,则隐藏横幅。
到目前为止 none 这些方法已经成功:(我做错了什么?我错过了什么吗?
观察者class:
class AdmobObserver extends RouteObserver<PageRoute<dynamic>> {
static ValueNotifier<bool> isBannerAdShowing = ValueNotifier<bool>(false);
BannerAd _myBanner = BannerAd(
adUnitId: AdManager.bannerAdUnitId,
size: AdSize.banner,
listener: (MobileAdEvent event) {
if (event == MobileAdEvent.loaded) {
isBannerAdShowing.value = true;
}
else if (event == MobileAdEvent.failedToLoad) {
isBannerAdShowing.value = false;
}
},
);
@override
void didPush(Route route, Route previousRoute) {
super.didPush(route, previousRoute);
if (route.settings.name == '/settings') {
_myBanner?.dispose();
isBannerAdShowing.value = false;
} else {
_showBannerAd();
}
}
@override
void didPop(Route route, Route previousRoute) {
super.didPop(route, previousRoute);
if (route.settings.name == '/settings') {
_myBanner?.dispose();
isBannerAdShowing.value = false;
} else {
_showBannerAd();
}
}
void _showBannerAd() {
_myBanner
..load()
..show();
}
}
编辑:
我设法让观察者调用 dispose 但现在横幅要么不处理要么抛出异常: This exception occurs when I navigate from
Home -> Settings -> Back to home(第一次构建应用程序时,当我进入设置时横幅消失,但错误仍然出现,但之后当我热重启时出现同样的错误并且横幅仍然存在,同样的错误当我从不同的页面弹出设置时也会发生(设置 -> 页面 -> 弹出回设置)
[ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: 'package:firebase_admob/firebase_admob.dart': Failed assertion: line 249 pos 12: '_allAds[id] != null': is not true.
E/flutter (17108): #0 _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:42:39)
E/flutter (17108): #1 _AssertionError._throwNew (dart:core-patch/errors_patch.dart:38:5)
E/flutter (17108): #2 MobileAd.dispose (package:firebase_admob/firebase_admob.dart:249:12)
E/flutter (17108): #3 AdmobObserver.didPop (package:Switcheroo/AdManager.dart:87:18)
您需要这样处理横幅
try {
_myBanner?.dispose();
_myBanner = null;
} catch (ex) {
log("banner dispose error");
}
也参见此处,BannerAd
listener
属性 中的解决方案。我似乎仍然需要 catch
块来解决恼人的错误。尽管至少这样横幅可以正确隐藏。
我目前正在尝试在我的应用程序中显示 admob 横幅,但是有两个页面我不希望显示横幅(目前我只使用设置路由进行测试),并调用处置横幅没有隐藏它。
我尝试了什么:
- 为每个小部件创建横幅并在小部件的
onDispose
方法的覆盖内调用 dispose 方法 - 创建一个广告管理器 class,它创建了横幅并保存了对它的引用,并从所述 class 调用一个函数,该函数在
init
内的横幅上调用 dispose我不希望显示横幅的页面。 - 我当前的解决方案:观察者 class 在推送时显示横幅,如果路由名称与我要查找的名称匹配,则隐藏横幅。
到目前为止 none 这些方法已经成功:(我做错了什么?我错过了什么吗?
观察者class:
class AdmobObserver extends RouteObserver<PageRoute<dynamic>> {
static ValueNotifier<bool> isBannerAdShowing = ValueNotifier<bool>(false);
BannerAd _myBanner = BannerAd(
adUnitId: AdManager.bannerAdUnitId,
size: AdSize.banner,
listener: (MobileAdEvent event) {
if (event == MobileAdEvent.loaded) {
isBannerAdShowing.value = true;
}
else if (event == MobileAdEvent.failedToLoad) {
isBannerAdShowing.value = false;
}
},
);
@override
void didPush(Route route, Route previousRoute) {
super.didPush(route, previousRoute);
if (route.settings.name == '/settings') {
_myBanner?.dispose();
isBannerAdShowing.value = false;
} else {
_showBannerAd();
}
}
@override
void didPop(Route route, Route previousRoute) {
super.didPop(route, previousRoute);
if (route.settings.name == '/settings') {
_myBanner?.dispose();
isBannerAdShowing.value = false;
} else {
_showBannerAd();
}
}
void _showBannerAd() {
_myBanner
..load()
..show();
}
}
编辑: 我设法让观察者调用 dispose 但现在横幅要么不处理要么抛出异常: This exception occurs when I navigate from Home -> Settings -> Back to home(第一次构建应用程序时,当我进入设置时横幅消失,但错误仍然出现,但之后当我热重启时出现同样的错误并且横幅仍然存在,同样的错误当我从不同的页面弹出设置时也会发生(设置 -> 页面 -> 弹出回设置)
[ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: 'package:firebase_admob/firebase_admob.dart': Failed assertion: line 249 pos 12: '_allAds[id] != null': is not true.
E/flutter (17108): #0 _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:42:39)
E/flutter (17108): #1 _AssertionError._throwNew (dart:core-patch/errors_patch.dart:38:5)
E/flutter (17108): #2 MobileAd.dispose (package:firebase_admob/firebase_admob.dart:249:12)
E/flutter (17108): #3 AdmobObserver.didPop (package:Switcheroo/AdManager.dart:87:18)
您需要这样处理横幅
try {
_myBanner?.dispose();
_myBanner = null;
} catch (ex) {
log("banner dispose error");
}
也参见此处,BannerAd
listener
属性 中的解决方案。我似乎仍然需要 catch
块来解决恼人的错误。尽管至少这样横幅可以正确隐藏。