Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
6cf9cc8
SchoolSelectionScreen -> SelectSchoolScreen 이름 변경
hwoo7449 Feb 16, 2026
946d705
MyHomePage -> HomeScreen 이름 변경
hwoo7449 Feb 16, 2026
0729fc5
docs: gitattributes 파일 추가
hwoo7449 Feb 17, 2026
feb7a5a
chore: 안드로이드 외 플랫폼 폴더 삭제
hwoo7449 Feb 17, 2026
7b29601
feat: 앱 초기 진입 분기(AppGate) 구조 도입
hwoo7449 Feb 17, 2026
b169e75
잠깐 로딩하는 화면 SplashScreen 추가
hwoo7449 Feb 17, 2026
a9ed4a4
feat: 라우팅 테스트용 온보딩 프로토타입 화면 추가
hwoo7449 Feb 17, 2026
d0b683c
refactor: 라우트 기반 네비게이션 구조로 전환 및 기존 로직 제거
hwoo7449 Feb 17, 2026
76b6b3f
refactor: 전역 테마에서 대학 색상 분리 및 ThemeData 간소화
hwoo7449 Feb 17, 2026
fbae854
feat: 학교 선택 화면의 선택한 대학 반환을 위해 라우트 구조 변경
hwoo7449 Feb 18, 2026
7de5221
refactor: pushNamedAndRemoveUntil 사용
hwoo7449 Feb 18, 2026
334fe19
refactor: SplashScreen 위젯 사용
hwoo7449 Feb 18, 2026
07a697a
feat: 직접 값을 바꾸지 않고 선택한 대학만 반환하도록 로직 변경
hwoo7449 Feb 18, 2026
1c95ef7
feat: PopScope 사용하여 학교선택 화면을 불러오는 주체에 따라 뒤로가기 가능 여부 조정
hwoo7449 Feb 18, 2026
6fa495d
feat: 학교선택을 함수로 빼고 온보딩 화면에서 홈 화면으로 이동하는 기능 구현
hwoo7449 Feb 18, 2026
0ca7469
feat: 설정화면에서 학교 선택후 설정화면으로 다시 돌아오도록 로직 변경
hwoo7449 Feb 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* text=auto
2 changes: 2 additions & 0 deletions lib/constants/app_colors.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ class AppColors {
// 인스턴스화 방지 (C++의 static class처럼 사용)
AppColors._();

static const Color primaryNeutral = Color(0x0061656f);

// --- 텍스트 컬러 (Grayscale) ---
static const Color greyTextColor = Color(0xFF8B8787);
static const Color grayDividerColor = Color(0xFF797979); // 리스트 구분선
Expand Down
109 changes: 68 additions & 41 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import 'package:bobmoo/constants/app_colors.dart';
import 'package:bobmoo/constants/app_constants.dart';
import 'package:bobmoo/locator.dart';
import 'package:bobmoo/models/university.dart';
import 'package:bobmoo/providers/univ_provider.dart';
import 'package:bobmoo/screens/app_gate.dart';
import 'package:bobmoo/screens/home_screen.dart';
import 'package:bobmoo/screens/school_selection_screen.dart';
import 'package:bobmoo/screens/onboarding_screen.dart';
import 'package:bobmoo/screens/select_school_screen.dart';
import 'package:bobmoo/screens/settings_screen.dart';
import 'package:bobmoo/services/background_service.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
Expand Down Expand Up @@ -61,49 +65,76 @@ class BobMooApp extends StatelessWidget {
designSize: const Size(402, 874),
minTextAdapt: true,
builder: (context, child) {
return Consumer<UnivProvider>(
builder: (context, univProvider, _) {
// [분기점 1] 아직 저장소에서 데이터를 읽는 중이라면?
if (!univProvider.isInitialized) {
return const MaterialApp(
home: Scaffold(
body: Center(
child: CircularProgressIndicator(),
), // 로딩 TODO: 나중에 밥묵자 로고로 바꾸든 하기
),
);
return MaterialApp(
debugShowCheckedModeBanner: false,
initialRoute: "/",
onGenerateRoute: (settings) {
switch (settings.name) {
// 앱 시작점
case "/":
return MaterialPageRoute(
settings: settings,
builder: (_) => const AppGate(),
);

// 온보딩 화면 라우트
case "/onboarding":
return MaterialPageRoute(
settings: settings,
builder: (_) => const OnboardingScreen(),
);

// 학교 선택 화면 라우트
case "/select_school":
// 여기만 “반환 타입”을 명시
final bool allowBack = settings.arguments as bool;
return MaterialPageRoute<University?>(
settings: settings,
builder: (_) => SelectSchoolScreen(allowBack: allowBack),
);

// 홈화면 라우트
case "/home":
return MaterialPageRoute(
settings: settings,
builder: (_) => const HomeScreen(),
);

// 설정화면 라우트
case "/settings":
return MaterialPageRoute(
settings: settings,
builder: (_) => const SettingsScreen(),
);

// 잘못된 라우트 이름
default:
return MaterialPageRoute(
settings: settings,
builder: (_) => const Scaffold(
body: Center(child: Text("Unknown route")),
),
);
}

// [분기점 2] 데이터를 읽었는데 대학 정보가 있다면 해당 색상을, 없으면 기본 light 테마로(추후 수정)
return MaterialApp(
debugShowCheckedModeBanner: false,
title: '밥묵자',
theme: univProvider.selectedUniversity == null
? _getThemeData(Colors.white)
: _getThemeData(
univProvider.selectedUniversity!.hexToColor(),
),
locale: const Locale('ko', 'KR'), // 앱의 기본 언어를 한국어로 설정
localizationsDelegates: const [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: const [
Locale('ko', 'KR'),
],
home: univProvider.selectedUniversity == null
? const SchoolSelectionScreen()
: MyHomePage(),
);
},
title: '밥묵자',
theme: _getThemeData(),
locale: const Locale('ko', 'KR'), // 앱의 기본 언어를 한국어로 설정
localizationsDelegates: const [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: const [
Locale('ko', 'KR'),
],
);
},
);
}

// 테마 생성 로직
ThemeData _getThemeData(Color schoolColor) {
ThemeData _getThemeData() {
return ThemeData(
fontFamily: 'Pretendard',

Expand All @@ -112,13 +143,9 @@ class BobMooApp extends StatelessWidget {

colorScheme: ColorScheme.fromSeed(
// [기본 설정]
seedColor: schoolColor,
seedColor: AppColors.primaryNeutral,
brightness: Brightness.light,

// [대학교 색상]
// primary: 가장 중요한 요소 (활성 버튼, 앱바 등)
primary: schoolColor,
onPrimary: Colors.white, // primary 글자색
// [표면/컴포넌트 컬러]
// surface: 카드, 바텀시트, 다이얼로그의 기본 배경색
surface: Colors.white,
Expand Down
50 changes: 50 additions & 0 deletions lib/screens/app_gate.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import 'package:bobmoo/providers/univ_provider.dart';
import 'package:bobmoo/screens/splash_screen.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class AppGate extends StatefulWidget {
const AppGate({super.key});

@override
State<AppGate> createState() => _AppGateState();
}

class _AppGateState extends State<AppGate> {
// 한번만 실행되게 가드역할
bool _redirected = false;

@override
void didChangeDependencies() {
super.didChangeDependencies();

final univProvider = context.watch<UnivProvider>();

if (_redirected) return;

if (!univProvider.isInitialized) {
// 아직 초기화 전이면 UI만 보여주고 대기
return;
}

_redirected = true;

// build 후에 이동
WidgetsBinding.instance.addPostFrameCallback((_) {
if (!mounted) return;

final targetRoute = (univProvider.selectedUniversity != null)
? "/home"
: "/onboarding";

Navigator.of(
context,
).pushNamedAndRemoveUntil(targetRoute, (route) => false);
});
}

@override
Widget build(BuildContext context) {
return const SplashScreen();
}
}
8 changes: 4 additions & 4 deletions lib/screens/home_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,14 @@ import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';

class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
class HomeScreen extends StatefulWidget {
const HomeScreen({super.key});

@override
State<MyHomePage> createState() => _MyHomePageState();
State<HomeScreen> createState() => _HomeScreenState();
}

class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
final MealRepository _repository = locator<MealRepository>();
late Future<List<Meal>> _mealFuture;

Expand Down
38 changes: 38 additions & 0 deletions lib/screens/onboarding_screen.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import 'package:bobmoo/models/university.dart';
import 'package:bobmoo/providers/univ_provider.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class OnboardingScreen extends StatefulWidget {
const OnboardingScreen({super.key});

@override
State<OnboardingScreen> createState() => _OnboardingScreenState();
}

class _OnboardingScreenState extends State<OnboardingScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: TextButton(
onPressed: _openSelectSchool,
child: Center(
child: Text("시작하기", style: TextStyle(color: Colors.black)),
),
),
);
}

Future<void> _openSelectSchool() async {
final University? university = await Navigator.of(
context,
).pushNamed<University?>("/select_school", arguments: false);

if (!mounted) return;

if (university != null) {
context.read<UnivProvider>().updateUniversity(university);
}
Navigator.of(context).pushNamedAndRemoveUntil("/home", (route) => false);
}
}
98 changes: 0 additions & 98 deletions lib/screens/school_selection_screen.dart

This file was deleted.

Loading