Ответ 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 - пользователь снова поворачивает устройство и т.д.
Как я отмечал в комментарии, эффективным решением было бы отслеживать последний размер баннера и реагировать на события загрузки баннера, чтобы обеспечить удобство работы для пользователя.