diff --git a/lib/main.dart b/lib/main.dart index a62056c..c634a13 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,19 +1,14 @@ -import 'package:blueberry_flutter_template/screens/mypage/password/PasswordResetPage.dart'; -import 'package:blueberry_flutter_template/screens/TopScreen.dart'; +import 'package:blueberry_flutter_template/router/RouterProvider.dart'; import 'package:blueberry_flutter_template/utils/AppStrings.dart'; -import 'package:blueberry_flutter_template/utils/ResponsiveLayoutBuilder.dart'; -import 'package:dart_openai/dart_openai.dart'; import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; + import 'firebase_options.dart'; import 'providers/ThemeProvider.dart'; -import 'screens/SplashScreen.dart'; import 'utils/AppTheme.dart'; Future main() async { - OpenAI.apiKey = ""; // OpenAI API Key를 넣어주세요. WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, @@ -25,32 +20,21 @@ Future main() async { class MyApp extends StatelessWidget { const MyApp({super.key}); - // This widget is the root of your application. @override Widget build(BuildContext context) { return ProviderScope( child: Consumer( builder: (context, ref, child) { - // ThemeProvider를 구독하여 다크모드 상태를 가져옴 - final themeMode = ref.watch(themeNotifierProvider); + final themeMode = ref.watch(themeNotifierProvider); // 테마 모드 상태 관리 객체 + final router = ref.watch(routerProvider); // 라우터 객체 - return MaterialApp( - navigatorKey: navigatorKey, + return MaterialApp.router( + routerConfig: router, debugShowCheckedModeBanner: false, title: AppStrings.appTitle, - // 라이트 모드 테마 설정 theme: lightTheme, - // 다크 모드 테마 설정 darkTheme: darkTheme, - // 현재 테마 모드 설정 themeMode: themeMode, - // 플랫폼에 따른 초기 화면 설정(web은 스플래쉬스크린 없음) - home: kIsWeb - ? ResponsiveLayoutBuilder( - context, - const TopScreen(), - ) - : const SplashScreen(), ); }, ), diff --git a/lib/router/RouterProvider.dart b/lib/router/RouterProvider.dart new file mode 100644 index 0000000..b44dc9b --- /dev/null +++ b/lib/router/RouterProvider.dart @@ -0,0 +1,40 @@ +import 'package:blueberry_flutter_template/screens/SettingScreen.dart'; +import 'package:blueberry_flutter_template/screens/TopScreen.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; + +import '../screens/SplashScreen.dart'; +import '../screens/mypage/SignUpScreen.dart'; +import '../utils/ResponsiveLayoutBuilder.dart'; + +final routerProvider = Provider((ref) { + return GoRouter( + routes: [ + GoRoute( + path: '/', + builder: (context, state) => ResponsiveLayoutBuilder( + context, + kIsWeb ? const TopScreen() : const SplashScreen(), + )), + GoRoute( + path: '/TopScreen', + name: TopScreen.name, + builder: (context, state) => + ResponsiveLayoutBuilder(context, const TopScreen()), + ), + GoRoute( + path: '/SignUpScreen', + name: SignUpScreen.name, + builder: (context, state) => + ResponsiveLayoutBuilder(context, const SignUpScreen()), + ), + GoRoute( + path: '/SettingsScreen', + name: SettingScreen.name, + builder: (context, state) => + ResponsiveLayoutBuilder(context, const SettingScreen()), + ) + ], + ); +}); diff --git a/lib/screens/SettingScreen.dart b/lib/screens/SettingScreen.dart index a0f5120..4ecb111 100644 --- a/lib/screens/SettingScreen.dart +++ b/lib/screens/SettingScreen.dart @@ -5,6 +5,7 @@ import '../providers/NotificationProvider.dart'; import '../providers/ThemeProvider.dart'; class SettingScreen extends ConsumerWidget { + static const String name = 'SettingsScreen'; const SettingScreen({super.key}); @override diff --git a/lib/screens/SplashScreen.dart b/lib/screens/SplashScreen.dart index a2853f3..7375421 100644 --- a/lib/screens/SplashScreen.dart +++ b/lib/screens/SplashScreen.dart @@ -3,14 +3,11 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/foundation.dart'; // kIsWeb 상수 사용 import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; - -import '../utils/ResponsiveLayoutBuilder.dart'; - -/// 작성일: 2024-07-01 -/// 작성자: 오물개 -/// 내용: 앱 초기화와 필수 자원 로딩을 관리하는 스플래쉬 스크린 구현 +import 'package:go_router/go_router.dart'; class SplashScreen extends ConsumerStatefulWidget { + static const String routeName = '/SplashScreen'; + const SplashScreen({super.key}); @override @@ -43,13 +40,9 @@ class _SplashScreenState extends ConsumerState { // 스플레쉬 스크린 확인을 위한 3초 지연 await Future.delayed(const Duration(seconds: 3)); // 초기화 완료 후 메인 화면으로 전환 - Navigator.of(context).pushReplacement( - MaterialPageRoute( - builder: (context) => ResponsiveLayoutBuilder( - context, - const TopScreen(), - )), - ); + if (mounted) { + context.goNamed(TopScreen.name); + } } catch (e) { // 초기화 중 발생한 오류 처리 print('초기화 오류: $e'); diff --git a/lib/screens/TopScreen.dart b/lib/screens/TopScreen.dart index 430503d..caf0510 100644 --- a/lib/screens/TopScreen.dart +++ b/lib/screens/TopScreen.dart @@ -18,6 +18,7 @@ import 'friendsList/FriendsListScreen.dart'; final selectedIndexProvider = StateProvider((ref) => 0); class TopScreen extends ConsumerWidget { + static const String name = '/TopScreen'; const TopScreen({super.key}); @override diff --git a/lib/screens/mypage/LoginScreen.dart b/lib/screens/mypage/LoginScreen.dart index 14a89ed..b90d011 100644 --- a/lib/screens/mypage/LoginScreen.dart +++ b/lib/screens/mypage/LoginScreen.dart @@ -1,5 +1,7 @@ +import 'package:blueberry_flutter_template/screens/mypage/SignUpScreen.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; import '../../providers/camera/PageProvider.dart'; import '../../providers/user/FirebaseAuthServiceProvider.dart'; @@ -7,8 +9,8 @@ import '../../providers/user/UserInfoProvider.dart'; import '../../services/SocialAuthService.dart'; import '../../utils/AppStrings.dart'; import '../../widgets/SquareTitleWidget.dart'; +import '../TopScreen.dart'; import 'MyPageScreen.dart'; -import 'SignUpScreen.dart'; import 'camera/ProfileCameraPage.dart'; import 'camera/ProfileGalleryPage.dart'; @@ -153,10 +155,7 @@ Widget _buildLogin(BuildContext context, WidgetRef ref) { child: const Text(AppStrings.loginButtonText), ), TextButton( - onPressed: () => Navigator.push( - context, - MaterialPageRoute(builder: (context) => const SignUpScreen()), - ), + onPressed: () => context.goNamed(SignUpScreen.name), child: const Text( AppStrings.signUpButtonText, style: TextStyle(color: Colors.blue), diff --git a/lib/screens/mypage/MyPageScreen.dart b/lib/screens/mypage/MyPageScreen.dart index b94c7d5..cf32a45 100644 --- a/lib/screens/mypage/MyPageScreen.dart +++ b/lib/screens/mypage/MyPageScreen.dart @@ -8,6 +8,7 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; import 'package:image_picker/image_picker.dart'; import '../../providers/camera/FirebaseStoreServiceProvider.dart'; @@ -133,9 +134,7 @@ class MyPageScreen extends ConsumerWidget { const CustomDividerWidget(), GestureDetector( onTap: () { - Navigator.push(context, MaterialPageRoute(builder: (context) { - return const SettingScreen(); - })); + context.goNamed(SettingScreen.name); }, child: const ListTile( leading: Icon(Icons.notifications), diff --git a/lib/screens/mypage/SignUpScreen.dart b/lib/screens/mypage/SignUpScreen.dart index b649095..54a7b78 100644 --- a/lib/screens/mypage/SignUpScreen.dart +++ b/lib/screens/mypage/SignUpScreen.dart @@ -29,9 +29,9 @@ final phoneNumberProvider = StateProvider((ref) => ''); final verificationNumberProvider = StateProvider((ref) => ''); class SignUpScreen extends StatefulWidget { + static const String name = 'SignUpScreen'; const SignUpScreen({super.key}); - @override State createState() => _SignUpScreenState(); } diff --git a/pubspec.yaml b/pubspec.yaml index f59b3fa..14e8cfb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -71,13 +71,17 @@ dependencies: easy_engine: ^0.0.4 cloud_functions: ^5.0.2 - # Lints + # Lint flutter_lints: ^3.0.0 + + # Generate flutter_gen: ^5.6.0 - build_runner: ^2.4.11 json_serializable: ^6.8.0 + # Router + go_router: ^14.2.1 + dev_dependencies: flutter_test: sdk: flutter