fix(ad): 네이티브 템플릿 높이 보정

This commit is contained in:
JiWoong Sul
2025-12-05 15:52:16 +09:00
parent 0e45616dfd
commit 887f1ad6fe

View File

@@ -1,6 +1,7 @@
import 'dart:async';
import 'dart:math';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';
import 'package:lunchpick/core/constants/app_colors.dart';
@@ -18,7 +19,7 @@ class NativeAdPlaceholder extends StatefulWidget {
const NativeAdPlaceholder({
super.key,
this.margin,
this.height = 200,
this.height = 360,
this.refreshInterval = const Duration(minutes: 2),
this.enabled = true,
});
@@ -155,21 +156,29 @@ class _NativeAdPlaceholderState extends State<NativeAdPlaceholder> {
@override
Widget build(BuildContext context) {
final isDark = Theme.of(context).brightness == Brightness.dark;
final containerHeight = _resolveContainerHeight();
if (!AdHelper.isMobilePlatform || !widget.enabled) {
return _buildPlaceholder(isDark, isLoading: false);
return _buildPlaceholder(
isDark,
containerHeight: containerHeight,
isLoading: false,
);
}
return AnimatedSwitcher(
duration: const Duration(milliseconds: 250),
child: _isLoaded && _nativeAd != null
? _buildAdView(isDark)
: _buildPlaceholder(isDark, isLoading: _isLoading),
? _buildAdView(isDark, containerHeight)
: _buildPlaceholder(
isDark,
containerHeight: containerHeight,
isLoading: _isLoading,
),
);
}
Widget _buildAdView(bool isDark) {
final containerHeight = max(widget.height, 200.0);
Widget _buildAdView(bool isDark, double containerHeight) {
return Container(
key: const ValueKey('nativeAdLoaded'),
margin: widget.margin ?? EdgeInsets.zero,
@@ -180,8 +189,11 @@ class _NativeAdPlaceholderState extends State<NativeAdPlaceholder> {
);
}
Widget _buildPlaceholder(bool isDark, {required bool isLoading}) {
final containerHeight = max(widget.height, 200.0);
Widget _buildPlaceholder(
bool isDark, {
required double containerHeight,
required bool isLoading,
}) {
return Container(
key: const ValueKey('nativeAdPlaceholder'),
margin: widget.margin ?? EdgeInsets.zero,
@@ -205,6 +217,18 @@ class _NativeAdPlaceholderState extends State<NativeAdPlaceholder> {
);
}
double _resolveContainerHeight() {
final platformMinHeight = switch (defaultTargetPlatform) {
TargetPlatform.iOS => 402.0,
TargetPlatform.android => 350.0,
_ => 320.0,
};
// 네이티브 템플릿(Medium) 기본 레이아웃이 플랫폼별로 350~402dp를 요구해
// 호출자가 지정한 높이보다 작을 경우 클리핑을 막기 위해 최소 높이를 강제한다.
return max(widget.height, platformMinHeight);
}
BoxDecoration _decoration(bool isDark) {
return BoxDecoration(
color: isDark ? AppColors.darkSurface : Colors.white,