From e6c7ba95520ab8544f9961f585e7a5e6dc9521b8 Mon Sep 17 00:00:00 2001 From: theorose49 Date: Tue, 30 Jun 2026 16:26:58 +0900 Subject: [PATCH] =?UTF-8?q?fix(mobile):=20edge-to-edge=EB=A1=9C=20?= =?UTF-8?q?=EC=A0=84=ED=99=98=ED=95=B4=20=ED=97=A4=EB=8D=94/=ED=91=B8?= =?UTF-8?q?=ED=84=B0=20=EC=95=88=EC=A0=84=EC=98=81=EC=97=AD=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - main: SystemUiMode.edgeToEdge + 내비게이션바 투명 → WebView가 시스템바 뒤까지 전체 화면 차지 → 웹의 env(safe-area-inset-*) (viewport-fit=cover)가 실제값 수신 - webview: SafeArea top·bottom 모두 false (셸은 inset을 잡지 않고 웹 CSS가 처리) → 헤더 눌림/푸터 과다 여백 해소 Co-Authored-By: Claude Opus 4.8 (1M context) --- android/app/google-services.json | 29 +++++++++++++++++++++++++++++ lib/main.dart | 8 +++++++- lib/webview_screen.dart | 3 ++- 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 android/app/google-services.json diff --git a/android/app/google-services.json b/android/app/google-services.json new file mode 100644 index 0000000..d58c1c6 --- /dev/null +++ b/android/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "332409988740", + "project_id": "special-partners-internal", + "storage_bucket": "special-partners-internal.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:332409988740:android:33ded5b63cb6c1644ac4d1", + "android_client_info": { + "package_name": "com.specialpartners.spin" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAzrtq093lZQacN9sDLpDyPrSSqDZMbQHc" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index a8feb64..2d6ec91 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -8,11 +8,17 @@ const navy = Color(0xFF03143F); Future main() async { WidgetsFlutterBinding.ensureInitialized(); - // 상태바: navy 위 밝은 아이콘 (몰입형 느낌). + // Edge-to-edge: 시스템바 뒤까지 그려 WebView가 전체 화면을 차지하게 한다. 그래야 + // 웹의 env(safe-area-inset-*) (viewport-fit=cover)가 실제 노치/홈인디케이터 값을 + // 받아 헤더/푸터 여백이 정확해진다. + SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); + // 상태바: 투명 + 밝은 아이콘. 하단 내비게이션바도 투명(웹 탭바가 그 위에 안착). SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( statusBarColor: Colors.transparent, statusBarIconBrightness: Brightness.light, statusBarBrightness: Brightness.dark, + systemNavigationBarColor: Colors.transparent, + systemNavigationBarIconBrightness: Brightness.dark, )); await PushService.instance.init(); // Firebase 미설정이면 비활성으로 진행 runApp(const SpinApp()); diff --git a/lib/webview_screen.dart b/lib/webview_screen.dart index 7bba31b..a6562c0 100644 --- a/lib/webview_screen.dart +++ b/lib/webview_screen.dart @@ -147,7 +147,8 @@ class _WebViewScreenState extends State with WidgetsBindingObserv child: Scaffold( backgroundColor: _navy, body: SafeArea( - top: false, // 상단 노치는 웹의 safe-area CSS가 처리 + top: false, // 상·하단 모두 웹의 safe-area CSS(env)가 처리 — 셸은 inset을 잡지 않는다 + bottom: false, child: Stack( children: [ InAppWebView(