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

Flutter中Google AdManager多尺寸Banner广告无法获取实际尺寸求助

解决Flutter中google_mobile_ads多尺寸Banner广告的尺寸适配问题

关键在于获取广告实际加载后的真实尺寸,而非依赖初始请求的尺寸列表,这样就能解决滚动Column里广告高度异常的问题。以下是具体实现方案:

核心修改点

  • 新增变量存储广告实际加载后的尺寸
  • 在广告加载完成的回调中捕获真实尺寸
  • 用真实尺寸渲染广告容器,彻底规避无限高度错误或广告隐藏问题

完整代码示例

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

class BannerAdWidget extends StatefulWidget {
  final String adUnitId;

  const BannerAdWidget({super.key, required this.adUnitId});

  @override
  State<BannerAdWidget> createState() => _BannerAdWidgetState();
}

class _BannerAdWidgetState extends State<BannerAdWidget> {
  AdManagerBannerAd? _bannerAd;
  bool _isLoaded = false;
  AdSize? _adSize; // 存储实际加载的广告尺寸

  Future<void> loadAd() async {
    _bannerAd = AdManagerBannerAd(
      adUnitId: widget.adUnitId,
      request: const AdManagerAdRequest(),
      sizes: const [
        AdSize(width: 300, height: 100),
        AdSize(width: 300, height: 250),
        AdSize(width: 300, height: 600)
      ],
      listener: AdManagerBannerAdListener(
        onAdLoaded: (ad) {
          if (!mounted) {
            ad.dispose();
            return;
          }
          debugPrint('$ad loaded.');
          setState(() {
            _isLoaded = true;
            _adSize = ad.size; // 捕获AdMob返回的真实广告尺寸
          });
        },
        onAdFailedToLoad: (ad, error) {
          debugPrint('AdManagerBannerAd failed to load: $error');
          ad.dispose();
        },
      ),
    )..load();
  }

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

  @override
  void dispose() {
    _bannerAd?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // 确保广告已加载且真实尺寸已获取
    if (_isLoaded && _bannerAd != null && _adSize != null) {
      return Align(
        alignment: Alignment.bottomCenter,
        child: SafeArea(
          child: SizedBox(
            width: _adSize!.width.toDouble(),
            height: _adSize!.height.toDouble(),
            child: AdWidget(ad: _bannerAd!),
          ),
        ),
      );
    }
    // 广告未加载时返回占位(可替换为自定义加载指示器)
    return const SizedBox.shrink();
  }
}

代码说明

  1. 存储真实尺寸:新增_adSize变量,专门保存广告加载完成后AdMob返回的实际尺寸。
  2. 捕获尺寸时机:在onAdLoaded回调中,通过ad.size拿到真实尺寸并更新状态,触发UI重绘。
  3. 安全渲染逻辑:只有当广告加载完成且尺寸非空时,才渲染带有精准宽高的广告容器,完美适配滚动Column的布局要求,不会再出现高度错误或广告显示异常。

内容的提问来源于stack exchange,提问作者Peter Trdin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 13:10:13