Firebase Admob横幅广告遮挡导航抽屉问题求助
嘿,我太懂你这个烦恼了——Banner Ad挡在导航抽屉前面真的很影响体验,不过咱们可以通过把广告嵌入Flutter Widget树的方式彻底解决这个问题,告别全局悬浮的广告层级冲突。
核心思路
之前你用BannerAd.show()显示广告,本质是把广告放在原生视图层,它的层级比Flutter的导航抽屉更高,所以抽屉滑出来会被压在下面。改用AdWidget把Banner转化成普通Flutter Widget嵌入界面后,导航抽屉作为Scaffold的上层组件,会自然显示在广告上方。
完整修改后的示例代码
import 'package:flutter/material.dart'; import 'package:firebase_admob/firebase_admob.dart'; // 替换成你的AdMob App ID const String appId = "ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy"; // 替换成你的Banner Ad单元ID const String bannerAdUnitId = "ca-app-pub-xxxxxxxxxxxxxxxx/zzzzzzzzzz"; void main() { FirebaseAdMob.instance.initialize(appId: appId); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return MaterialApp( title: 'AdMob Banner Demo', home: const HomePage(), ); } } class HomePage extends StatefulWidget { const HomePage({Key? key}) : super(key: key); @override State<HomePage> createState() => _HomePageState(); } class _HomePageState extends State<HomePage> { late BannerAd _bannerAd; bool _isBannerAdLoaded = false; @override void initState() { super.initState(); _initBannerAd(); } void _initBannerAd() { _bannerAd = BannerAd( adUnitId: bannerAdUnitId, size: AdSize.banner, listener: BannerAdListener( onAdLoaded: (Ad ad) { setState(() { _isBannerAdLoaded = true; }); }, onAdFailedToLoad: (Ad ad, LoadAdError error) { ad.dispose(); print('Banner Ad加载失败: $error'); }, ), ); _bannerAd.load(); } @override void dispose() { _bannerAd.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Demo Page')), drawer: Drawer( child: ListView( padding: EdgeInsets.zero, children: const [ DrawerHeader( decoration: BoxDecoration(color: Colors.blue), child: Text('导航抽屉'), ), ListTile(title: Text('菜单项1')), ListTile(title: Text('菜单项2')), ], ), ), body: const Center(child: Text('主内容区域')), floatingActionButton: const FloatingActionButton( onPressed: null, child: Icon(Icons.add), ), // 把Banner Ad作为Scaffold的底部组件 bottomNavigationBar: _isBannerAdLoaded ? SizedBox( height: _bannerAd.size.height.toDouble(), width: _bannerAd.size.width.toDouble(), child: AdWidget(ad: _bannerAd), ) : null, ); } }
关键改动说明
- 用
AdWidget包裹BannerAd,将其转化为Flutter Widget,嵌入到Scaffold的bottomNavigationBar中(你也可以继续用persistentFooterButtons,效果一致) - 通过StatefulWidget管理广告的加载、销毁生命周期,避免内存泄漏
- 现在导航抽屉滑出时,会自动显示在Banner Ad上方,完全不会被遮挡
记得替换代码里的App ID和Banner Ad单元ID为你自己的AdMob信息哦!
内容的提问来源于stack exchange,提问作者riftninja
相关产品推荐
相关产品推荐

