Flutter中Google Mobile Ads的BannerAdWidget报错修复咨询
修复google_mobile_ads ^1.0.1集成的三个错误
错误原因及对应修复方案
1. AdWithViewListener无法作为mixin使用
问题根源:AdWithViewListener是带有构造函数的抽象类,Flutter中mixin不允许包含构造函数,因此不能用with关键字混入。
修复:将with AdWithViewListener改为extends BannerAdListener(BannerAdListener是AdWithViewListener的子类,直接继承它更适配Banner广告场景)。
2. MyAdListener无法赋值给BannerAdListener类型参数
问题根源:自定义监听器的继承关系错误,导致类型不匹配。
修复:让MyAdListener直接继承BannerAdListener,而非其他不兼容的类/抽象类。
3. 类只能继承其他类的错误
问题根源:对非mixin类型的类误用了with关键字,Flutter中只有mixin类才能用with混入,普通类只能用extends继承。
修复:检查代码中类似class X with SomeClass的写法,将with改为extends。
完整可运行示例代码
import 'dart:io'; import 'package:flutter/material.dart'; import 'package:google_mobile_ads/google_mobile_ads.dart'; // 自定义Banner广告监听器:正确继承BannerAdListener class MyAdListener extends BannerAdListener { MyAdListener(); @override void onAdLoaded() { super.onAdLoaded(); print('Banner广告加载成功'); } @override void onAdFailedToLoad(LoadAdError error) { super.onAdFailedToLoad(error); print('Banner广告加载失败: ${error.message}'); } @override void onAdClicked() { super.onAdClicked(); print('Banner广告被点击'); } } class BannerAdWidget extends StatefulWidget { const BannerAdWidget({Key? key}) : super(key: key); @override State<BannerAdWidget> createState() => _BannerAdWidgetState(); } class _BannerAdWidgetState extends State<BannerAdWidget> { BannerAd? _bannerAd; bool _isAdLoaded = false; // 测试用广告单元ID,上线替换为自己的正式ID final String _adUnitId = Platform.isAndroid ? 'ca-app-pub-3940256099942544/6300978111' : 'ca-app-pub-3940256099942544/2934735716'; @override void initState() { super.initState(); _loadBannerAd(); } void _loadBannerAd() { _bannerAd = BannerAd( adUnitId: _adUnitId, size: AdSize.banner, request: const AdRequest(), // 传入自定义监听器,类型匹配 listener: MyAdListener() ..onAdLoaded = () { setState(() => _isAdLoaded = true); } ..onAdFailedToLoad = (error) { setState(() { _isAdLoaded = false; _bannerAd?.dispose(); _bannerAd = null; }); }, )..load(); } @override void dispose() { _bannerAd?.dispose(); super.dispose(); } @override Widget build(BuildContext context) { if (_isAdLoaded && _bannerAd != null) { return SizedBox( width: _bannerAd!.size.width.toDouble(), height: _bannerAd!.size.height.toDouble(), child: AdWidget(ad: _bannerAd!), ); } else { return SizedBox( height: 50, child: Center(child: Text('广告加载中...')), ); } } }
额外注意事项
- 确保
pubspec.yaml中依赖配置正确:google_mobile_ads: ^1.0.1,执行flutter pub get同步依赖。 - 测试用广告单元ID是AdMob官方提供的,上线前必须替换为自己在AdMob后台创建的正式单元ID。
- 广告组件使用后务必调用
dispose()释放资源,避免内存泄漏。
内容的提问来源于stack exchange,提问作者A_K
相关产品推荐
相关产品推荐

