// ๐Ÿšช ์•ฑ ์ง„์ž…์ . Firebase/๋ฐฑ๊ทธ๋ผ์šด๋“œ ๊ฐ์‹œ ์„œ๋น„์Šค ์ดˆ๊ธฐํ™” ํ›„ ๋กœ๊ทธ์ธ ํ™”๋ฉด์œผ๋กœ ์‹œ์ž‘ํ•œ๋‹ค. // ์‹ค์ œ ํ™”๋ฉด ๊ตฌํ˜„์€ lib/screens/ ํด๋”, ๊ณตํ†ต ์„ค์ •์€ lib/config.dart ์ฐธ๊ณ . import 'dart:io'; import 'package:flutter/foundation.dart' show kIsWeb; import 'package:flutter/material.dart'; import 'package:firebase_core/firebase_core.dart'; import 'firebase_options.dart'; import 'config.dart'; import 'function/session_store.dart'; import 'pocket_watch_service.dart'; import 'theme/app_palette.dart'; import 'ui/login_screen.dart'; import 'ui/main_dashboard.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); await printFCMToken(); if (!kIsWeb && Platform.isAndroid) { await initializePocketWatchService(); } runApp(const SchoolAttendanceApp()); } // ๐ŸŒŠ ์Šคํฌ๋กค์ด ๋์— ๋‹ฟ์„ ๋•Œ ๋‚˜์˜ค๋Š” ํŒŒ๋ž€์ƒ‰ ์˜ค๋ฒ„์Šคํฌ๋กค ๊ธ€๋กœ์šฐ ํšจ๊ณผ๋ฅผ ์—†์•ค๋‹ค. class _NoGlowScrollBehavior extends MaterialScrollBehavior { @override Widget buildOverscrollIndicator( BuildContext context, Widget child, ScrollableDetails details, ) { return child; } } class SchoolAttendanceApp extends StatelessWidget { const SchoolAttendanceApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, title: '$schoolName ํ•™์ƒ ๋„์šฐ๋ฏธ', scrollBehavior: _NoGlowScrollBehavior(), theme: ThemeData( useMaterial3: true, scaffoldBackgroundColor: AppPalette.mist, colorScheme: ColorScheme.fromSeed( seedColor: AppPalette.ink, brightness: Brightness.light, ).copyWith( primary: AppPalette.ink, onPrimary: AppPalette.paper, secondary: AppPalette.ink, onSecondary: AppPalette.paper, surface: AppPalette.paper, onSurface: AppPalette.ink, ), ), home: const _StartupGate(), // ๐Ÿšช ์ €์žฅ๋œ ๋กœ๊ทธ์ธ์ด ์žˆ์œผ๋ฉด ๋Œ€์‹œ๋ณด๋“œ๋กœ, ์—†์œผ๋ฉด ๋กœ๊ทธ์ธ ํ™”๋ฉด์œผ๋กœ. ); } } /// ๐Ÿ” "๋กœ๊ทธ์ธ ์œ ์ง€" ์ง„์ž…์ . ๊ธฐ๊ธฐ์— ์ €์žฅ๋œ ์„ธ์…˜์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋™์•ˆ ์ž ๊น ๋กœ๋”ฉ์„ ๋ณด์—ฌ์ฃผ๊ณ , /// ์žˆ์œผ๋ฉด ๋กœ๊ทธ์ธ ํ™”๋ฉด ์—†์ด ๋ฐ”๋กœ ๋Œ€์‹œ๋ณด๋“œ๋กœ, ์—†์œผ๋ฉด ๋กœ๊ทธ์ธ ํ™”๋ฉด์œผ๋กœ ๋ณด๋‚ธ๋‹ค. class _StartupGate extends StatefulWidget { const _StartupGate(); @override State<_StartupGate> createState() => _StartupGateState(); } class _StartupGateState extends State<_StartupGate> { SavedSession? _session; bool _checked = false; @override void initState() { super.initState(); _checkSession(); } Future _checkSession() async { final session = await SessionStore.load(); if (!mounted) return; setState(() { _session = session; _checked = true; }); } @override Widget build(BuildContext context) { if (!_checked) { return Scaffold( backgroundColor: AppPalette.mist, body: const Center(child: CircularProgressIndicator()), ); } final session = _session; if (session != null) { return MainDashboard( userId: session.userId, userName: session.userName, role: session.role, isDeviceMatched: session.isDeviceMatched, ); } return const LoginScreen(); } }