You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase Admob横幅广告遮挡导航抽屉问题求助

解决Firebase AdMob Banner遮挡导航抽屉的问题

嘿,我太懂你这个烦恼了——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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:20:14