class AppBannerAdManager {
  BannerAd? _bannerAd;
  bool _isAdLoaded = false;

  VoidCallback? onAdLoadedCallback;

  AppBannerAdManager({this.onAdLoadedCallback});

  void loadBannerAd() {
    _bannerAd = BannerAd(
      adUnitId: 'ca-app-pub-3940256099942544/9214589741', // 실제 광고 단위 ID로 변경
      size: AdSize.banner,
      request: AdRequest(),
      listener: BannerAdListener(
        onAdLoaded: (Ad ad) {
          _isAdLoaded = true;
          print('배너 광고 로드 성공');
          // 광고 로드 시 상태 업데이트
          // 이때 setState를 호출하려면 해당 클래스가 StatefulWidget이어야 합니다.
          // 하지만 AppBannerAdManager는 그렇지 않으므로, 콜백으로 상태 업데이트를 전달해야 합니다.
          onAdLoadedCallback?.call();
        },

        onAdFailedToLoad: (Ad ad, LoadAdError error) {
          ad.dispose();
          print('배너 광고 로드 실패: $error');
        },
      ),
    );

    _bannerAd!.load();
  }

광고 로드 및 리소스 해제 기능을 제공하는 class

BannerAd? _BannerAd: google_mobile_ads 패키지에 있는 객체. ?는 null일 수 있음을 의미한다.

VoidCallback? onAdLoadedCallback: 광고가 로드되었을 때 호출될 콜백 함수.

AppBannerAdManager({this.onAdLoadedCallback}): 생성자. onAdLoadedCallback을 배개변수로 받음.

void loadBannerAd(): 배너 광고를 초기화하고 로드하는 역할

_bannerAd = BannerAd(...) : 새로운 BannerAd 인스턴스 생성

listenr: BannerAdListener: 광고 로드 상태를 모니터링하는 리스너

onAdLoaded: 광고가 정상적으로 로드됐을 경우. onAdLoadedCallback을 호출. ApBannerAdManager는 StatefulWidget이 아니므로 setState가 아니라 callback을 통해 상태 업데이트를 전달한다.

onAdFailedToLoad: 로드 실패했을 때, dispose로 리소스를 해제한다.

_bannerAd!.load(): 광고를 실제로 로드하는 method. 여기서 로드에 성공하면 listener 처리가 시작된다.

double? get bannerHeight => _isAdLoaded?_bannerAd?.size.height.toDouble() : 0: 광고가 로드되면 광고 높이 확인

Widget getBannerWidget(): 배너 광고가 로드된 경우 광고를 표시하는 위젯을 반환. 로드 실패 시, 빈 위젯 반환

Container: 광고를 감싸는 컨테이너 위젯

child: AdWidget(ad: _bannerAd!): 광고 객체를 전달받아서 표시. Container안에 bannerAd를 child로 두고 표시.

SizedBox.shrink(): 빈 공간을 차지하지 않는 위젯

 

+ Recent posts