Как получить размер баннера смарт-баннера?

Я пытаюсь интегрировать AdMob через firebase_admob в моем флаттере приложение.

По умолчанию кажется, что он просто накладывает/накладывает баннер поверх текущего представления... без учета действительного дерева виджетов и его ограничений.

Я действительно понятия не имею, почему кто-то может создать такую библиотеку... но хорошо. Может по причинам мошенничества?!

Чтобы не покрывать фактический контент баннером, я бы хотел добавить к моему контенту отступ (padding height = banner-height).

Поскольку я использую "умные баннеры", библиотека динамически пытается найти лучший размер баннера для данного размера экрана во время выполнения.

Как узнать какой размер баннера он придумал??

Ответ 1

Это код, который я использую, чтобы получить высоту смарт-баннера, в соответствии со спецификациями Google.

  /// The initial size of the banner is calculated on the height of the
  /// viewport. Due to ADMob banner refresh policies, in order to have
  /// a consistent behaviour, we should keep track of the current AD size
  /// and maintain it when the user rotates the screen, and update that
  /// value at every banner successful.
  /// For now, we will avoid this complexity and set the banner height to
  /// the maximum height that a banner could get on this device, forcing
  /// the use of the longest side as the base.
  /// see https://developers.google.com/admob/android/banner#smart_banners
  double _getSmartBannerHeight(BuildContext context) {
    MediaQueryData mediaScreen = MediaQuery.of(context);
    double dpHeight = mediaScreen.orientation == Orientation.portrait
        ? mediaScreen.size.height
        : mediaScreen.size.width;
    log.fine("Device height: $dpHeight");
    if (dpHeight <= 400.0) {
      return 32.0;
    }
    if (dpHeight > 720.0) {
      return 90.0;
    }
    return 50.0;
  }

Как видите, вместо вычисления высоты баннера относительно фактической высоты устройства (другими словами, в соответствии с ориентацией устройства) я использую всегда самую длинную сторону устройства.

Это сделано потому, что когда пользователь поворачивает устройство, официальный плагин flutter_admob не перезагружает соответствующий баннер. Рассмотрим следующий сценарий: - устройство в портретном режиме, баннер загружается при 50 - пользователь поворачивает устройство: в соответствии с документацией высота должна быть 32, но баннер не будет перезагружен, оставляя его на высоте 50 - происходит новая загрузка баннера, согласно в настройках вашей кампании, предоставляя баннер высотой 32 - пользователь снова поворачивает устройство и т.д.

Как я отмечал в комментарии, эффективным решением было бы отслеживать последний размер баннера и реагировать на события загрузки баннера, чтобы обеспечить удобство работы для пользователя.

Ответ 2

Из спецификаций, опубликованных в ответе @mattia-galati, также доступны варианты фиксированной высоты. Почему бы вам не использовать один из них?

AdSize.banner, AdSize.largeBanner и другие имеют фиксированную высоту.

Есть ли какая-то конкретная причина использовать AdSize.smartBanner?