import 'package:flutter/material.dart';
import 'dart:async';
import 'package:adwhale_sdk_flutter/adwhale_sdk_flutter.dart';
class AppOpenAdScreen extends StatefulWidget {
const AppOpenAdScreen({super.key});
@override
State<AppOpenAdScreen> createState() => _AppOpenAdScreenState();
}
class _AppOpenAdScreenState extends State<AppOpenAdScreen> with WidgetsBindingObserver {
AdWhaleAppOpenAd? _appOpenAd;
bool _isLoaded = false;
AppLifecycleState? _appLifecycleState;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
_initializeAndLoadAppOpen();
}
Future<void> _initializeAndLoadAppOpen() async {
// SDK 초기화
final result = await AdWhaleMediationAds.instance.initialize();
if (result.isSuccess) {
print('SDK 초기화 성공: ${result.message}');
_loadAppOpen();
} else {
print('SDK 초기화 실패: ${result.statusCode}, ${result.message}');
}
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
_appLifecycleState = state;
if (state == AppLifecycleState.resumed) {
// 백그라운드에서 포그라운드로 전환 시 광고 표시
if (_isLoaded && _appOpenAd != null) {
_appOpenAd!.showAd();
_isLoaded = false;
_appOpenAd = null;
}
}
}
void _loadAppOpen() {
_appOpenAd?.destroy();
_appOpenAd = null;
_isLoaded = false;
_appOpenAd = AdWhaleAppOpenAd(
placementUid: 'your-placement-uid',
adLoadCallback: AdWhaleAppOpenAdLoadCallback(
onLoaded: () {
print('앱오프닝 광고 로드 성공');
setState(() {
_isLoaded = true;
});
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('앱오프닝 광고 로드 완료')),
);
}
},
onLoadFailed: (errorCode, errorMessage) {
print('앱오프닝 광고 로드 실패: $errorCode, $errorMessage');
setState(() {
_appOpenAd = null;
_isLoaded = false;
});
},
onShowed: () {
print('앱오프닝 광고 표시됨');
},
onShowFailed: (errorCode, errorMessage) {
print('앱오프닝 광고 표시 실패: $errorCode, $errorMessage');
setState(() {
_appOpenAd = null;
_isLoaded = false;
});
},
onDismissed: () {
print('앱오프닝 광고 닫힘');
setState(() {
_appOpenAd = null;
_isLoaded = false;
});
// 다음 광고 미리 로드
_loadAppOpen();
},
onClicked: () {
print('앱오프닝 광고 클릭됨');
},
),
)
..setRegion('서울시 강남구')
..setGcoder(37.5665, 126.9780)
..setPlacementName('test_app_open');
_appOpenAd!.loadAd();
}
void _showAppOpen() {
if (_appOpenAd != null && _isLoaded) {
_appOpenAd!.showAd();
_isLoaded = false;
_appOpenAd = null;
} else {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('앱오프닝 광고를 먼저 로드해 주세요.')),
);
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('앱오프닝 광고 예제')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: _loadAppOpen,
child: const Text('광고 로드'),
),
const SizedBox(height: 16),
ElevatedButton(
onPressed: _isLoaded ? _showAppOpen : null,
child: const Text('광고 표시'),
),
],
),
),
);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
_appOpenAd?.destroy();
super.dispose();
}
}