横幅广告.处置不工作颤振广告



我目前正在尝试在我的应用中显示admob横幅,但是有两个页面我不希望显示横幅(目前我只使用设置路线进行测试(,并且在横幅上调用dispose不会隐藏它。

我尝试过:

为每个小部件
  1. 创建横幅,并在小部件的onDispose方法的覆盖中调用 dispose 方法
  2. 创建一个创建横幅并保存对横幅的引用的 Ad Manager 类,并从该类调用一个函数,该函数在我不希望横幅显示横幅的页面init内的横幅上调用 dispose 。
  3. 我当前的解决方案:一个观察器类,它在推送时显示横幅,如果路由的名称与我要查找的名称匹配,则隐藏横幅。

到目前为止,这些方法都没有成功:(我做错了什么?我错过了什么吗?

观察者类:

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 但现在横幅要么不处置,要么抛出异常:当我从 主页 -> 设置 -> 回到主页(首次构建应用程序时,当我转到设置时横幅消失,但仍然发生错误,但之后当我热重启时发生相同的错误并且横幅仍然存在,当我从其他页面弹出设置时也会发生相同的错误(设置 -> 页面 -> 弹出回设置(

[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块来处理恼人的错误。虽然至少这样横幅可以正确隐藏。

https://github.com/flutter/flutter/issues/21474

为什么首页上的广告没有被处理掉?第 2 页上的广告仅在我切换到下一页时打开,但第一页上的广告始终保持打开状态。

import 'package:flutter/material.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';

void main() {
WidgetsFlutterBinding.ensureInitialized();

MobileAds.instance.initialize();
runApp(const MaterialApp(
title: 'Navigation Basics',
home: FirstRoute(),
));
}

class FirstRoute extends StatefulWidget {
const FirstRoute({super.key});

@override
State<FirstRoute> createState() => _FirstRouteState();
}

class _FirstRouteState extends State<FirstRoute> {
late BannerAd? _bannerAd;

bool _isBannerAdReady = false;

void _loadBannerAd() {
_bannerAd = BannerAd(
adUnitId: 'ca-app-pub-3940256099942544/6300978111',
size: AdSize.banner,
request: AdRequest(),
listener: BannerAdListener(
onAdLoaded: (_) {
setState(() {
_isBannerAdReady = true;
});
},
onAdFailedToLoad: (ad, error) {
_bannerAd!.dispose();
},
),
);

_bannerAd!.load();
}

@override
void initState() {
super.initState();
_loadBannerAd();
}

void dispose() {
super.dispose();
_bannerAd!.dispose();
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('First Route'),
),
body: Center(
child: ElevatedButton(
child: const Text('Open route'),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const SecondRoute()),
);
},
),
),
bottomNavigationBar: _isBannerAdReady
? SizedBox(
width: _bannerAd!.size.width.toDouble(),
height: _bannerAd!.size.height.toDouble(),
child: AdWidget(ad: _bannerAd!))
: SizedBox(
width: _bannerAd!.size.width.toDouble(),
height: _bannerAd!.size.height.toDouble(),
),
);
}
}

class SecondRoute extends StatefulWidget {
const SecondRoute({super.key});

@override
State<SecondRoute> createState() => _SecondRouteState();
}

class _SecondRouteState extends State<SecondRoute> {
late BannerAd? _bannerAd;

bool _isBannerAdReady = false;

void _loadBannerAd() {
_bannerAd = BannerAd(
adUnitId: 'ca-app-pub-3940256099942544/6300978111',
size: AdSize.banner,
request: AdRequest(),
listener: BannerAdListener(
onAdLoaded: (_) {
setState(() {
_isBannerAdReady = true;
});
},
onAdFailedToLoad: (ad, error) {
_bannerAd!.dispose();
},
),
);

_bannerAd!.load();
}

@override
void initState() {
super.initState();
_loadBannerAd();
}

void dispose() {
super.dispose();
_bannerAd!.dispose();
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Second Route'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.pop(context);
},
child: const Text('Go back!'),
),
),
bottomNavigationBar: _isBannerAdReady
? SizedBox(
width: _bannerAd!.size.width.toDouble(),
height: _bannerAd!.size.height.toDouble(),
child: AdWidget(ad: _bannerAd!))
: SizedBox(
width: _bannerAd!.size.width.toDouble(),
height: _bannerAd!.size.height.toDouble(),
),
);
}
}

最新更新