...
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
import 'dart:io';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:google_mobile_ads/google_mobile_ads.dart';
|
||||
|
||||
class AdBannerWidget extends StatefulWidget {
|
||||
const AdBannerWidget({super.key});
|
||||
|
||||
@override
|
||||
State<AdBannerWidget> createState() => _AdBannerWidgetState();
|
||||
}
|
||||
|
||||
class _AdBannerWidgetState extends State<AdBannerWidget> {
|
||||
BannerAd? _bannerAd;
|
||||
bool _isAdLoaded = false;
|
||||
|
||||
// TODO: 릴리스 시 실제 Ad Unit ID로 교체하세요.
|
||||
final String _androidAdUnitId = 'ca-app-pub-3940256099942544/6300978111'; // 테스트 ID
|
||||
final String _iosAdUnitId = 'ca-app-pub-3940256099942544/2934735716'; // 테스트 ID
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_loadAd();
|
||||
}
|
||||
|
||||
void _loadAd() {
|
||||
_bannerAd = BannerAd(
|
||||
adUnitId: Platform.isAndroid ? _androidAdUnitId : _iosAdUnitId,
|
||||
size: AdSize.banner,
|
||||
request: const AdRequest(),
|
||||
listener: BannerAdListener(
|
||||
onAdLoaded: (Ad ad) {
|
||||
setState(() {
|
||||
_isAdLoaded = true;
|
||||
});
|
||||
},
|
||||
onAdFailedToLoad: (Ad ad, LoadAdError error) {
|
||||
print('Ad failed to load: $error');
|
||||
ad.dispose();
|
||||
},
|
||||
),
|
||||
)..load();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_bannerAd?.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (_isAdLoaded && _bannerAd != null) {
|
||||
// 광고가 로드되면 광고 위젯을 표시
|
||||
return Container(
|
||||
width: _bannerAd!.size.width.toDouble(),
|
||||
height: _bannerAd!.size.height.toDouble(),
|
||||
alignment: Alignment.center,
|
||||
child: AdWidget(ad: _bannerAd!),
|
||||
);
|
||||
} else {
|
||||
// 로드되지 않았으면, 광고 높이만큼의 빈 공간만 차지
|
||||
return Container(
|
||||
height: AdSize.banner.height.toDouble(),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
// packages/feature_common/lib/widgets/common_game_shell.dart
|
||||
import 'package:flutter/material.dart';
|
||||
import '../screens/ranking_screen.dart';
|
||||
import '../screens/settings_screen.dart';
|
||||
import 'ad_banner_widget.dart';
|
||||
|
||||
/// 모든 게임 앱이 공유하는 '공통 셸' 위젯
|
||||
/// (AppBar, 설정/랭킹 버튼, 하단 광고 배너 포함)
|
||||
class CommonGameShell extends StatelessWidget {
|
||||
final Widget body;
|
||||
final String title;
|
||||
|
||||
/// 랭킹 버튼을 눌렀을 때 실행될 함수 (외부 주입)
|
||||
/// null을 전달하면 랭킹 버튼이 비활성화됩니다.
|
||||
final VoidCallback? onRankingPressed;
|
||||
|
||||
const CommonGameShell({
|
||||
super.key,
|
||||
required this.body,
|
||||
required this.title,
|
||||
this.onRankingPressed,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text(title),
|
||||
actions: [
|
||||
// 랭킹 버튼
|
||||
IconButton(
|
||||
icon: const Icon(Icons.leaderboard_outlined),
|
||||
onPressed: onRankingPressed, // 👈 주입받은 함수 실행
|
||||
),
|
||||
// 설정 버튼
|
||||
IconButton(
|
||||
icon: const Icon(Icons.settings_outlined),
|
||||
onPressed: () {
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (context) => const SettingsScreen(),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
body: body, // 👈 주입받은 내용물
|
||||
bottomNavigationBar: const AdBannerWidget(),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user