From 43e62637b366acfa2ff2d07303aa2d561dea7dd6 Mon Sep 17 00:00:00 2001 From: Jungwoo <108061510+jwson-automation@users.noreply.github.com> Date: Wed, 24 Jul 2024 23:35:10 +0900 Subject: [PATCH 1/5] go_router add --- lib/main.dart | 28 ++++++---------------------- lib/router/RouterProvider.dart | 25 +++++++++++++++++++++++++ lib/screens/SplashScreen.dart | 16 +++++----------- pubspec.yaml | 8 ++++++-- 4 files changed, 42 insertions(+), 35 deletions(-) create mode 100644 lib/router/RouterProvider.dart 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..096046f --- /dev/null +++ b/lib/router/RouterProvider.dart @@ -0,0 +1,25 @@ +import 'package:blueberry_flutter_template/screens/TopScreen.dart'; +import 'package:blueberry_flutter_template/screens/mbti/MBTIScreen.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 '../utils/ResponsiveLayoutBuilder.dart'; + +final routerProvider = Provider((ref) { + return GoRouter( + routes: [ + GoRoute( + path: '/', + builder: (context, state) => ResponsiveLayoutBuilder( + context, + kIsWeb ? const TopScreen() : const SplashScreen(), + )), + GoRoute( + path: '/home', + builder: (context, state) => const TopScreen(), + ), + ], + ); +}); diff --git a/lib/screens/SplashScreen.dart b/lib/screens/SplashScreen.dart index a2853f3..3d481c2 100644 --- a/lib/screens/SplashScreen.dart +++ b/lib/screens/SplashScreen.dart @@ -1,15 +1,13 @@ +import 'package:blueberry_flutter_template/router/RouterProvider.dart'; import 'package:blueberry_flutter_template/screens/TopScreen.dart'; 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 'package:go_router/go_router.dart'; import '../utils/ResponsiveLayoutBuilder.dart'; -/// 작성일: 2024-07-01 -/// 작성자: 오물개 -/// 내용: 앱 초기화와 필수 자원 로딩을 관리하는 스플래쉬 스크린 구현 - class SplashScreen extends ConsumerStatefulWidget { const SplashScreen({super.key}); @@ -43,13 +41,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.go('/home'); // GoRouter를 사용한 라우팅 + } } catch (e) { // 초기화 중 발생한 오류 처리 print('초기화 오류: $e'); 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 From da76e2ef0aba8d10e223ac18bfb9921ea1936187 Mon Sep 17 00:00:00 2001 From: Jungwoo <108061510+jwson-automation@users.noreply.github.com> Date: Wed, 24 Jul 2024 23:54:29 +0900 Subject: [PATCH 2/5] change path and path Name --- lib/router/RouterProvider.dart | 18 +++++++++++++++--- lib/screens/SplashScreen.dart | 6 ++---- lib/screens/TopScreen.dart | 1 + lib/screens/mypage/LoginScreen.dart | 9 ++++----- lib/screens/mypage/SignUpScreen.dart | 1 + 5 files changed, 23 insertions(+), 12 deletions(-) diff --git a/lib/router/RouterProvider.dart b/lib/router/RouterProvider.dart index 096046f..543949a 100644 --- a/lib/router/RouterProvider.dart +++ b/lib/router/RouterProvider.dart @@ -1,10 +1,11 @@ +import 'package:blueberry_flutter_template/screens/SettingScreen.dart'; import 'package:blueberry_flutter_template/screens/TopScreen.dart'; -import 'package:blueberry_flutter_template/screens/mbti/MBTIScreen.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) { @@ -17,9 +18,20 @@ final routerProvider = Provider((ref) { kIsWeb ? const TopScreen() : const SplashScreen(), )), GoRoute( - path: '/home', - builder: (context, state) => const TopScreen(), + path: '/TopScreen', + builder: (context, state) => + ResponsiveLayoutBuilder(context, const TopScreen()), ), + GoRoute( + path: '/SignUpScreen', + builder: (context, state) => + ResponsiveLayoutBuilder(context, const SignUpScreen()), + ), + GoRoute( + path: '/SettingsScreen', + builder: (context, state) => + ResponsiveLayoutBuilder(context, const SettingScreen()), + ) ], ); }); diff --git a/lib/screens/SplashScreen.dart b/lib/screens/SplashScreen.dart index 3d481c2..001185e 100644 --- a/lib/screens/SplashScreen.dart +++ b/lib/screens/SplashScreen.dart @@ -1,4 +1,3 @@ -import 'package:blueberry_flutter_template/router/RouterProvider.dart'; import 'package:blueberry_flutter_template/screens/TopScreen.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/foundation.dart'; // kIsWeb 상수 사용 @@ -6,9 +5,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; -import '../utils/ResponsiveLayoutBuilder.dart'; - class SplashScreen extends ConsumerStatefulWidget { + static const String routeName = '/SplashScreen'; const SplashScreen({super.key}); @override @@ -42,7 +40,7 @@ class _SplashScreenState extends ConsumerState { await Future.delayed(const Duration(seconds: 3)); // 초기화 완료 후 메인 화면으로 전환 if (mounted) { - context.go('/home'); // GoRouter를 사용한 라우팅 + GoRouter.of(context).go(TopScreen.routeName); } } catch (e) { // 초기화 중 발생한 오류 처리 diff --git a/lib/screens/TopScreen.dart b/lib/screens/TopScreen.dart index 430503d..acc573a 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 routeName = '/TopScreen'; const TopScreen({super.key}); @override diff --git a/lib/screens/mypage/LoginScreen.dart b/lib/screens/mypage/LoginScreen.dart index 14a89ed..7e3fe83 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.go(SignUpScreen.routeName), child: const Text( AppStrings.signUpButtonText, style: TextStyle(color: Colors.blue), diff --git a/lib/screens/mypage/SignUpScreen.dart b/lib/screens/mypage/SignUpScreen.dart index b649095..ad05b7d 100644 --- a/lib/screens/mypage/SignUpScreen.dart +++ b/lib/screens/mypage/SignUpScreen.dart @@ -29,6 +29,7 @@ final phoneNumberProvider = StateProvider((ref) => ''); final verificationNumberProvider = StateProvider((ref) => ''); class SignUpScreen extends StatefulWidget { + static const String routeName = '/SignUpScreen'; const SignUpScreen({super.key}); From 1e8838c886322551ab34ff7d793f25fa9504e40b Mon Sep 17 00:00:00 2001 From: Jungwoo <108061510+jwson-automation@users.noreply.github.com> Date: Thu, 25 Jul 2024 22:02:36 +0900 Subject: [PATCH 3/5] fix to context.goName --- lib/router/RouterProvider.dart | 3 +++ lib/screens/SettingScreen.dart | 1 + lib/screens/SplashScreen.dart | 2 +- lib/screens/TopScreen.dart | 2 +- lib/screens/mypage/LoginScreen.dart | 2 +- lib/screens/mypage/SignUpScreen.dart | 3 +-- 6 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/router/RouterProvider.dart b/lib/router/RouterProvider.dart index 543949a..6ef5c2e 100644 --- a/lib/router/RouterProvider.dart +++ b/lib/router/RouterProvider.dart @@ -19,16 +19,19 @@ final routerProvider = Provider((ref) { )), 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 001185e..dfed93b 100644 --- a/lib/screens/SplashScreen.dart +++ b/lib/screens/SplashScreen.dart @@ -40,7 +40,7 @@ class _SplashScreenState extends ConsumerState { await Future.delayed(const Duration(seconds: 3)); // 초기화 완료 후 메인 화면으로 전환 if (mounted) { - GoRouter.of(context).go(TopScreen.routeName); + GoRouter.of(context).go(TopScreen.name); } } catch (e) { // 초기화 중 발생한 오류 처리 diff --git a/lib/screens/TopScreen.dart b/lib/screens/TopScreen.dart index acc573a..caf0510 100644 --- a/lib/screens/TopScreen.dart +++ b/lib/screens/TopScreen.dart @@ -18,7 +18,7 @@ import 'friendsList/FriendsListScreen.dart'; final selectedIndexProvider = StateProvider((ref) => 0); class TopScreen extends ConsumerWidget { - static const String routeName = '/TopScreen'; + 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 7e3fe83..b90d011 100644 --- a/lib/screens/mypage/LoginScreen.dart +++ b/lib/screens/mypage/LoginScreen.dart @@ -155,7 +155,7 @@ Widget _buildLogin(BuildContext context, WidgetRef ref) { child: const Text(AppStrings.loginButtonText), ), TextButton( - onPressed: () => context.go(SignUpScreen.routeName), + onPressed: () => context.goNamed(SignUpScreen.name), child: const Text( AppStrings.signUpButtonText, style: TextStyle(color: Colors.blue), diff --git a/lib/screens/mypage/SignUpScreen.dart b/lib/screens/mypage/SignUpScreen.dart index ad05b7d..54a7b78 100644 --- a/lib/screens/mypage/SignUpScreen.dart +++ b/lib/screens/mypage/SignUpScreen.dart @@ -29,10 +29,9 @@ final phoneNumberProvider = StateProvider((ref) => ''); final verificationNumberProvider = StateProvider((ref) => ''); class SignUpScreen extends StatefulWidget { - static const String routeName = '/SignUpScreen'; + static const String name = 'SignUpScreen'; const SignUpScreen({super.key}); - @override State createState() => _SignUpScreenState(); } From 78f459e1a79d5c1d6180200b3b683c64daca5f1f Mon Sep 17 00:00:00 2001 From: Jungwoo <108061510+jwson-automation@users.noreply.github.com> Date: Thu, 25 Jul 2024 22:16:30 +0900 Subject: [PATCH 4/5] fix setting go_router --- lib/router/RouterProvider.dart | 4 ++-- lib/screens/mypage/MyPageScreen.dart | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/router/RouterProvider.dart b/lib/router/RouterProvider.dart index 6ef5c2e..b44dc9b 100644 --- a/lib/router/RouterProvider.dart +++ b/lib/router/RouterProvider.dart @@ -25,13 +25,13 @@ final routerProvider = Provider((ref) { ), GoRoute( path: '/SignUpScreen', - name : SignUpScreen.name, + name: SignUpScreen.name, builder: (context, state) => ResponsiveLayoutBuilder(context, const SignUpScreen()), ), GoRoute( path: '/SettingsScreen', - name : SettingScreen.name, + name: SettingScreen.name, builder: (context, state) => ResponsiveLayoutBuilder(context, const SettingScreen()), ) diff --git a/lib/screens/mypage/MyPageScreen.dart b/lib/screens/mypage/MyPageScreen.dart index 5d62d4d..6be9d7e 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'; @@ -135,9 +136,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), @@ -324,4 +323,3 @@ Widget _uploadProfileImageButtons(FirestoreService firestoreService, icon: const Icon(Icons.settings), ); } - From 8d61a5627031ffb670574fe2200ed500c37a65cd Mon Sep 17 00:00:00 2001 From: Jungwoo <108061510+jwson-automation@users.noreply.github.com> Date: Thu, 25 Jul 2024 22:19:20 +0900 Subject: [PATCH 5/5] fix --- lib/screens/SplashScreen.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/screens/SplashScreen.dart b/lib/screens/SplashScreen.dart index dfed93b..7375421 100644 --- a/lib/screens/SplashScreen.dart +++ b/lib/screens/SplashScreen.dart @@ -7,6 +7,7 @@ import 'package:go_router/go_router.dart'; class SplashScreen extends ConsumerStatefulWidget { static const String routeName = '/SplashScreen'; + const SplashScreen({super.key}); @override @@ -40,7 +41,7 @@ class _SplashScreenState extends ConsumerState { await Future.delayed(const Duration(seconds: 3)); // 초기화 완료 후 메인 화면으로 전환 if (mounted) { - GoRouter.of(context).go(TopScreen.name); + context.goNamed(TopScreen.name); } } catch (e) { // 초기화 중 발생한 오류 처리