Skip to content

Commit 62f18f7

Browse files
committed
✨ feat: 챌린지 페이지 위젯 일부 구현
1 parent 4239894 commit 62f18f7

File tree

16 files changed

+264
-43
lines changed

16 files changed

+264
-43
lines changed

client/assets/icons/left_arrow.svg

Lines changed: 3 additions & 0 deletions
Loading

client/lib/config/font_system.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,9 @@ abstract class FontSystem {
8080
fontWeight: FontWeight.w500,
8181
height: 1.5,
8282
);
83+
static const TextStyle NavigationLabel = TextStyle(
84+
fontSize: 12,
85+
fontWeight: FontWeight.w500,
86+
height: 1.8,
87+
);
8388
}
Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,31 @@
11
import 'package:flutter/material.dart';
22
import 'package:greenap/config/color_system.dart';
3+
import 'package:greenap/widgets/app_bar/default_app_bar.dart';
4+
import 'package:greenap/views_model/challenge_view_model.dart';
5+
import './widgets/all_challenge/challenge_category_grid.dart';
6+
import 'package:greenap/widgets/common/custom_toggle_button.dart';
7+
import 'package:get/get.dart';
38

4-
class ChallengeScreen extends StatelessWidget {
9+
class ChallengeScreen extends GetView<ChallengeViewModel> {
510
const ChallengeScreen({super.key});
611

712
@override
813
Widget build(BuildContext context) {
9-
return Scaffold(
10-
backgroundColor: ColorSystem.white,
11-
body: Center(child: Text('챌린지 페이지')),
14+
return Padding(
15+
padding: const EdgeInsets.symmetric(horizontal: 20),
16+
child: Scaffold(
17+
backgroundColor: ColorSystem.white,
18+
appBar: DefaultAppBar(title: '챌린지'),
19+
body: Column(
20+
crossAxisAlignment: CrossAxisAlignment.start,
21+
children: [
22+
const SizedBox(height: 24),
23+
CustomToggleButton(leftText: "둘러보기", rightText: "나의 챌린지"),
24+
const SizedBox(height: 24),
25+
Expanded(child: ChallengeCategoryGrid()),
26+
],
27+
),
28+
),
1229
);
1330
}
1431
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:greenap/config/color_system.dart';
3+
import 'package:greenap/config/font_system.dart';
4+
import 'package:greenap/widgets/common/challenge_category_item.dart';
5+
6+
final categories = [
7+
{
8+
'name': '자원절약',
9+
'image': 'assets/images/resource.png',
10+
'color': ColorSystem.pinkGradient,
11+
},
12+
{
13+
'name': '친환경',
14+
'image': 'assets/images/eco.png',
15+
'color': ColorSystem.blueGradient,
16+
},
17+
{
18+
'name': '교통절감',
19+
'image': 'assets/images/transport.png',
20+
'color': ColorSystem.yellowGradient,
21+
},
22+
{
23+
'name': '재사용',
24+
'image': 'assets/images/reuse.png',
25+
'color': ColorSystem.greenGradient,
26+
},
27+
];
28+
29+
class ChallengeCategoryGrid extends StatelessWidget {
30+
const ChallengeCategoryGrid({super.key});
31+
@override
32+
Widget build(BuildContext context) {
33+
return GridView.count(
34+
crossAxisCount: 2,
35+
mainAxisSpacing: 12,
36+
crossAxisSpacing: 12,
37+
children: [
38+
ChallengeCategoryItem(
39+
category: categories[0],
40+
size: CategorySize.large,
41+
),
42+
ChallengeCategoryItem(
43+
category: categories[1],
44+
size: CategorySize.large,
45+
),
46+
47+
ChallengeCategoryItem(
48+
category: categories[2],
49+
size: CategorySize.large,
50+
),
51+
ChallengeCategoryItem(
52+
category: categories[3],
53+
size: CategorySize.large,
54+
),
55+
],
56+
);
57+
}
58+
}

client/lib/views/feed/feed_screen.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import 'package:flutter/material.dart';
22
import 'package:greenap/config/color_system.dart';
3+
import 'package:greenap/views_model/feed_view_model.dart';
4+
import 'package:get/get.dart';
35

4-
class FeedScreen extends StatelessWidget {
6+
class FeedScreen extends GetView<FeedViewModel> {
57
const FeedScreen({super.key});
68

79
@override

client/lib/views/home/home_screen.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ import 'package:greenap/config/color_system.dart';
44
import 'widgets/challenge_category/challenge_category.dart';
55
import 'widgets/user_info/user_info.dart';
66
import 'widgets/today_habit_card/today_habit_card.dart';
7+
import 'package:greenap/views_model/home_view_model.dart';
8+
import 'package:get/get.dart';
79

8-
class HomeScreen extends StatelessWidget {
10+
class HomeScreen extends GetView<HomeViewModel> {
911
const HomeScreen({super.key});
1012

1113
@override

client/lib/views/home/widgets/challenge_category/challenge_category_grid.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import 'package:flutter/material.dart';
22
import 'package:greenap/config/color_system.dart';
33
import 'package:greenap/config/font_system.dart';
4-
import './challenge_category_item.dart';
4+
import '../../../../widgets/common/challenge_category_item.dart';
55

66
class ChallengeCategoryGrid extends StatelessWidget {
77
const ChallengeCategoryGrid({super.key});

client/lib/views/mypage/mypage_screen.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import 'package:flutter/material.dart';
22
import 'package:greenap/config/color_system.dart';
3+
import 'package:get/get.dart';
4+
import 'package:greenap/views_model/mypage_view_model.dart';
35

4-
class MypageScreen extends StatelessWidget {
6+
class MypageScreen extends GetView<MypageViewModel> {
57
const MypageScreen({super.key});
68

79
@override

client/lib/views/root/root_screen.dart

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,40 +7,35 @@ import 'package:greenap/views/mypage/mypage_screen.dart' as mypage;
77
import 'package:greenap/views/verification/verification_screen.dart'
88
as verification;
99
import 'package:greenap/widgets/app_bar/custom_bottom_navigation_bar.dart';
10+
import 'package:get/get.dart';
11+
import 'package:greenap/views_model/root_view_model.dart';
1012

11-
class RootScreen extends StatefulWidget {
13+
class RootScreen extends GetView<RootViewModel> {
1214
const RootScreen({super.key});
13-
14-
@override
15-
State<RootScreen> createState() => _RootScreenState();
16-
}
17-
18-
class _RootScreenState extends State<RootScreen> {
19-
int _selectedIndex = 2; // 기본값: 홈
20-
21-
final List<Widget> _pages = [
22-
challenge.ChallengeScreen(),
23-
feed.FeedScreen(),
24-
home.HomeScreen(),
25-
verification.VerificationScreen(),
26-
mypage.MypageScreen(),
27-
];
28-
29-
void _onTap(int index) {
30-
setState(() {
31-
_selectedIndex = index;
32-
});
33-
}
34-
3515
@override
3616
Widget build(BuildContext context) {
17+
final List<Widget> pages = [
18+
challenge.ChallengeScreen(),
19+
feed.FeedScreen(),
20+
home.HomeScreen(),
21+
verification.VerificationScreen(),
22+
mypage.MypageScreen(),
23+
];
24+
3725
return SafeArea(
3826
child: Scaffold(
3927
backgroundColor: ColorSystem.white,
40-
body: IndexedStack(index: _selectedIndex, children: _pages),
41-
bottomNavigationBar: CustomBottomNavigationBar(
42-
currentIndex: _selectedIndex,
43-
onTap: _onTap,
28+
body: Obx(
29+
() => IndexedStack(
30+
index: controller.selectedIndex.value,
31+
children: pages,
32+
),
33+
),
34+
bottomNavigationBar: Obx(
35+
() => CustomBottomNavigationBar(
36+
currentIndex: controller.selectedIndex.value,
37+
onTap: controller.changeIndex,
38+
),
4439
),
4540
),
4641
);

client/lib/views/verification/verification_screen.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import 'package:flutter/material.dart';
22
import 'package:greenap/config/color_system.dart';
3+
import 'package:get/get.dart';
4+
import 'package:greenap/views_model/verification_view_model.dart';
35

4-
class VerificationScreen extends StatelessWidget {
6+
class VerificationScreen extends GetView<VerificationViewModel> {
57
const VerificationScreen({super.key});
68

79
@override

0 commit comments

Comments
 (0)