Flutter中Google AdManager多尺寸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(); } }
代码说明
- 存储真实尺寸:新增
_adSize变量,专门保存广告加载完成后AdMob返回的实际尺寸。 - 捕获尺寸时机:在
onAdLoaded回调中,通过ad.size拿到真实尺寸并更新状态,触发UI重绘。 - 安全渲染逻辑:只有当广告加载完成且尺寸非空时,才渲染带有精准宽高的广告容器,完美适配滚动Column的布局要求,不会再出现高度错误或广告显示异常。
内容的提问来源于stack exchange,提问作者Peter Trdin
相关产品推荐
相关产品推荐

