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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:07:48