From 887f1ad6fe17638edccb98bd6daaf5fef9b9975d Mon Sep 17 00:00:00 2001 From: JiWoong Sul Date: Fri, 5 Dec 2025 15:52:16 +0900 Subject: [PATCH] =?UTF-8?q?fix(ad):=20=EB=84=A4=EC=9D=B4=ED=8B=B0=EB=B8=8C?= =?UTF-8?q?=20=ED=85=9C=ED=94=8C=EB=A6=BF=20=EB=86=92=EC=9D=B4=20=EB=B3=B4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../widgets/native_ad_placeholder.dart | 40 +++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/lib/presentation/widgets/native_ad_placeholder.dart b/lib/presentation/widgets/native_ad_placeholder.dart index b1e6295..7a02a1d 100644 --- a/lib/presentation/widgets/native_ad_placeholder.dart +++ b/lib/presentation/widgets/native_ad_placeholder.dart @@ -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 { @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 { ); } - 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 { ); } + 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,