import 'dart:async'; import 'package:flutter/material.dart'; /// 간단한 전면 광고(Interstitial Ad) 모의 서비스 class AdService { /// 임시 광고 다이얼로그를 표시하고 사용자가 끝까지 시청했는지 여부를 반환한다. Future showInterstitialAd(BuildContext context) async { final result = await showDialog( context: context, barrierDismissible: false, builder: (_) => const _MockInterstitialAdDialog(), ); return result ?? false; } } class _MockInterstitialAdDialog extends StatefulWidget { const _MockInterstitialAdDialog(); @override State<_MockInterstitialAdDialog> createState() => _MockInterstitialAdDialogState(); } class _MockInterstitialAdDialogState extends State<_MockInterstitialAdDialog> { static const int _adDurationSeconds = 4; late Timer _timer; int _elapsedSeconds = 0; bool _completed = false; @override void initState() { super.initState(); _timer = Timer.periodic(const Duration(seconds: 1), (timer) { if (!mounted) return; setState(() { _elapsedSeconds++; }); if (_elapsedSeconds >= _adDurationSeconds && !_completed) { _completed = true; _timer.cancel(); Navigator.of(context).pop(true); } }); } @override void dispose() { _timer.cancel(); super.dispose(); } bool get _canClose => _elapsedSeconds >= _adDurationSeconds; double get _progress => (_elapsedSeconds / _adDurationSeconds).clamp(0, 1); @override Widget build(BuildContext context) { final isDark = Theme.of(context).brightness == Brightness.dark; return Dialog( insetPadding: const EdgeInsets.symmetric(horizontal: 24, vertical: 80), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), child: Stack( children: [ Padding( padding: const EdgeInsets.all(24), child: Column( mainAxisSize: MainAxisSize.min, children: [ const Icon( Icons.ondemand_video, size: 56, color: Colors.deepPurple, ), const SizedBox(height: 12), Text( '광고 시청 중...', style: TextStyle( fontSize: 20, fontWeight: FontWeight.bold, color: isDark ? Colors.white : Colors.black87, ), ), const SizedBox(height: 8), Text( _canClose ? '광고가 완료되었습니다.' : '잠시만 기다려 주세요.', style: TextStyle( color: isDark ? Colors.white70 : Colors.black54, ), ), const SizedBox(height: 24), LinearProgressIndicator( value: _progress, minHeight: 6, borderRadius: BorderRadius.circular(999), backgroundColor: Colors.grey.withValues(alpha: 0.2), color: Colors.deepPurple, ), const SizedBox(height: 12), Text( _canClose ? '광고가 완료되었어요. 자동으로 계속합니다.' : '남은 시간: ${_adDurationSeconds - _elapsedSeconds}초', style: TextStyle( color: isDark ? Colors.white70 : Colors.black54, ), ), const SizedBox(height: 12), TextButton( onPressed: () { Navigator.of(context).pop(false); }, child: const Text('닫기'), ), ], ), ), Positioned( right: 8, top: 8, child: IconButton( onPressed: () => Navigator.of(context).pop(false), icon: const Icon(Icons.close), ), ), ], ), ); } }