fix(ad): 스크린샷 모드에서 네이티브 광고 비활성화

This commit is contained in:
JiWoong Sul
2025-12-04 16:29:32 +09:00
parent 04b1c3e987
commit bcc26f5e79
11 changed files with 1037 additions and 230 deletions

View File

@@ -13,12 +13,14 @@ class NativeAdPlaceholder extends StatefulWidget {
final EdgeInsetsGeometry? margin;
final double height;
final Duration refreshInterval;
final bool enabled;
const NativeAdPlaceholder({
super.key,
this.margin,
this.height = 200,
this.refreshInterval = const Duration(minutes: 2),
this.enabled = true,
});
@override
@@ -35,7 +37,7 @@ class _NativeAdPlaceholderState extends State<NativeAdPlaceholder> {
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
if (!mounted) return;
if (!mounted || !widget.enabled) return;
_loadAd();
});
}
@@ -43,6 +45,20 @@ class _NativeAdPlaceholderState extends State<NativeAdPlaceholder> {
@override
void didUpdateWidget(covariant NativeAdPlaceholder oldWidget) {
super.didUpdateWidget(oldWidget);
if (!widget.enabled) {
_disposeAd();
setState(() {
_isLoading = false;
_isLoaded = false;
});
return;
}
if (!oldWidget.enabled && widget.enabled) {
_loadAd();
return;
}
if (widget.refreshInterval != oldWidget.refreshInterval && _isLoaded) {
_scheduleRefresh();
}
@@ -50,12 +66,19 @@ class _NativeAdPlaceholderState extends State<NativeAdPlaceholder> {
@override
void dispose() {
_refreshTimer?.cancel();
_nativeAd?.dispose();
_disposeAd();
super.dispose();
}
void _disposeAd() {
_refreshTimer?.cancel();
_refreshTimer = null;
_nativeAd?.dispose();
_nativeAd = null;
}
void _loadAd() {
if (!widget.enabled) return;
if (!AdHelper.isMobilePlatform) return;
if (!mounted) return;
@@ -102,6 +125,7 @@ class _NativeAdPlaceholderState extends State<NativeAdPlaceholder> {
void _scheduleRefresh({bool retry = false}) {
_refreshTimer?.cancel();
if (!mounted) return;
if (!widget.enabled) return;
final delay = retry ? const Duration(seconds: 30) : widget.refreshInterval;
_refreshTimer = Timer(delay, _loadAd);
}
@@ -132,7 +156,7 @@ class _NativeAdPlaceholderState extends State<NativeAdPlaceholder> {
Widget build(BuildContext context) {
final isDark = Theme.of(context).brightness == Brightness.dark;
if (!AdHelper.isMobilePlatform) {
if (!AdHelper.isMobilePlatform || !widget.enabled) {
return _buildPlaceholder(isDark, isLoading: false);
}