Руководство по миграции на версию 8

Новая 8-я версия плагина Yandex Mobile Ads для Flutter вносит в API ряд изменений, направленных на упрощение интеграции и единообразие с нативными SDK.

Основные изменения

Класс MobileAds переименован в YandexAds.

Переименованы следующие свойства и методы:

SDK 7

SDK 8

MobileAds.setLocationConsent(bool)

YandexAds.setLocationTracking(bool)

MobileAds.setAgeRestrictedUser(bool)

YandexAds.setAgeRestricted(bool)

Запрос рекламы

Класс AdRequestConfiguration удалён. Для настройки запроса используйте AdRequest — идентификатор рекламного места (adUnitId) задаётся в нём.

Параметры таргетинга (age, contextQuery, contextTags, gender, location) вынесены из AdRequest в отдельный класс AdTargeting.

Запрос рекламы

SDK 7

final adRequestConfiguration = AdRequestConfiguration(
  adUnitId: 'your-ad-unit-id',
  age: 25,
  contextQuery: 'query',
  parameters: {'key': 'value'},
);

await adLoader.loadAd(
  adRequestConfiguration: adRequestConfiguration,
);

SDK 8

final adRequest = AdRequest(
  adUnitId: 'your-ad-unit-id',
  targeting: AdTargeting(
    age: 25,
    contextQuery: 'query',
  ),
  parameters: {'key': 'value'},
);

final ad = await adLoader.loadAd(adRequest: adRequest);

Полноэкранные форматы: межстраничная реклама, реклама с вознаграждением и реклама при открытии приложения

Изменён подход к созданию загрузчиков и загрузке объявлений: конструктор загрузчика вызывается синхронно, а метод loadAd возвращает Future с уже загруженным объявлением.

Классы InterstitialAdLoadListener, RewardedAdLoadListener и AppOpenAdLoadListener удалены — вместо колбэков используйте результат loadAd и обработку ошибок.

Загрузка рекламы

SDK 7

Асинхронное создание загрузчика с колбэками:

late final Future<InterstitialAdLoader> _adLoader =
      _createInterstitialAdLoader();
InterstitialAd? _ad;

Future<InterstitialAdLoader> _createInterstitialAdLoader() {
  return InterstitialAdLoader.create(
    onAdLoaded: (InterstitialAd interstitialAd) {
      // The ad was loaded successfully. Now you can show loaded ad
      _ad = interstitialAd;
    },
    onAdFailedToLoad: (error) {
      // Ad failed to load with AdRequestError.
      // Attempting to load a new ad from the onAdFailedToLoad() method is strongly discouraged.
    },
  );
}

Future<void> _loadInterstitialAd() async {
  final adLoader = await _adLoader;
  await adLoader.loadAd(adRequestConfiguration: AdRequestConfiguration(adUnitId: 'your-ad-unit-id'));
}

SDK 8

Синхронное создание загрузчика; loadAd при успехе возвращает объявление, при ошибке выбрасывает исключение AdRequestError:

final _adLoader = InterstitialAdLoader();
InterstitialAd? _ad;

Future<void> _loadInterstitialAd() async {
  try {
    _ad = await _adLoader.loadAd(
      adRequest: AdRequest(adUnitId: 'your-ad-unit-id'),
    );
  } on AdRequestError catch (error) {
    // Ad failed to load with AdRequestError.
    // Attempting to load a new ad from the error handler is strongly discouraged.
  }
}

Те же правила применяются к RewardedAdLoader и AppOpenAdLoader.

Баннеры

Изменён подход к созданию и загрузке баннеров: конструктор больше не принимает adRequest и обработчики событий. Объявление загружается отдельным вызовом load(AdRequest). О ходе загрузки и событиях показа сообщают подписки на потоки loadStateStream и events.

Создание и загрузка баннера

SDK 7

BannerAd? _banner;

void _createBanner() {
  _banner = BannerAd(
    adSize: BannerAdSize.stickySize(width),
    adRequest: AdRequest(),
    onAdLoaded: () {
      // Ad loaded
    },
    onAdFailedToLoad: (error) {
      // Ad failed to load
    },
    onAdClicked: () {},
    onImpression: (data) {},
  );
}

SDK 8

BannerAd? _banner;

void _createBanner() {
  final banner = BannerAd(adSize: BannerAdSize.stickySize(width));

  banner.loadStateStream.listen((state) {
    if (state is BannerAdLoadStateLoaded) {
      // Ad loaded
    } else if (state is BannerAdLoadStateError) {
      // Ad failed to load
    }
  });

  banner.events.listen((event) {
    if (event is BannerAdClickedEvent) {
      // Ad clicked
    } else if (event is BannerAdImpressionEvent) {
      // Impression
    }
  });

  banner.load(AdRequest(adUnitId: 'your-ad-unit-id'));
  _banner = banner;
}

Уничтожение баннера

SDK 7

_banner?.destroy();

SDK 8

await _banner?.destroy();

Класс AdInfo

Структура класса AdInfo обновлена: поле adSize удалено, добавлены поля creatives, extraData и partnerText.

SDK 7

SDK 8

AdInfo.adSize

Удалено

AdInfo.creatives (List<Creative>)

AdInfo.extraData (String?)

AdInfo.partnerText (String?)

Удалённые события

Больше не поддерживаются события onLeftApplication, onReturnedToApplication и onAdClose — соответствующие обработчики из кода нужно убрать.