main.dart
import 'package:class_shoppingcart/components/shoppingcart_detail.dart';
import 'package:class_shoppingcart/components/shoppingcart_header.dart';
import 'package:class_shoppingcart/theme.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: mTheme(),
home: ShoppingCartPage(),
);
}
}
class ShoppingCartPage extends StatelessWidget {
const ShoppingCartPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: _buildShoppingCartAppBar(),
body: Column(
children: [
Expanded(child: ShoppingcartHeader()),
Expanded(child: ShoppingcartDetail()),
],
),
);
}
AppBar _buildShoppingCartAppBar() {
return AppBar(
leading: IconButton(
onPressed: () {},
icon: Icon(Icons.arrow_back),
),
actions: [
IconButton(
onPressed: () {},
icon: Icon(Icons.shopping_cart),
),
SizedBox(width: 16),
],
elevation: 0.0,
);
}
}
theme.dart
import 'package:class_shoppingcart/constans.dart';
import 'package:flutter/material.dart';
ThemeData mTheme() {
return ThemeData(
primarySwatch: kPrimaryColor,
scaffoldBackgroundColor: kPrimaryColor,
);
}
constans.dart
import 'package:flutter/material.dart';
const kPrimaryColor = MaterialColor(0xFFeeeeee, {
50: Color(0xFFeeeeee),
100: Color(0xFFeeeeee),
150: Color(0xFFeeeeee),
200: Color(0xFFeeeeee),
300: Color(0xFFeeeeee),
400: Color(0xFFeeeeee),
500: Color(0xFFeeeeee),
600: Color(0xFFeeeeee),
700: Color(0xFFeeeeee),
800: Color(0xFFeeeeee),
900: Color(0xFFeeeeee),
});
const kSecondaryColor = Color(0xFFc6c6c6); // 기본 버튼 색
const kAccentColor = Color(0xFFff7643); // 활성화 버튼 색
components/shoppingcart_header.dart
import 'package:class_shoppingcart/constans.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class ShoppingcartHeader extends StatefulWidget {
const ShoppingcartHeader({super.key});
@override
State<ShoppingcartHeader> createState() => _ShoppingcartHeaderState();
}
class _ShoppingcartHeaderState extends State<ShoppingcartHeader> {
int selectedId = 0;
List<String> selectPic = [
'assets/p1.jpeg',
'assets/p2.jpeg',
'assets/p3.jpeg',
'assets/p4.jpeg',
];
@override
Widget build(BuildContext context) {
return Column(
children: [
// 이미지 영역
Padding(
padding: const EdgeInsets.all(16.0),
child: AspectRatio(
aspectRatio: 5 / 3,
child: Image.asset(
selectPic[selectedId],
fit: BoxFit.cover,
),
),
),
// 버튼 4개 row 가로 배치된 버튼 틀
Padding(
padding:
const EdgeInsets.only(left: 30, right: 30, top: 10, bottom: 10),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
_buildHeaderSelectorButton(0, Icons.pedal_bike),
_buildHeaderSelectorButton(1, Icons.motorcycle),
_buildHeaderSelectorButton(2, CupertinoIcons.car_detailed),
_buildHeaderSelectorButton(3, CupertinoIcons.airplane),
],
),
),
],
);
}
// 메서드
Widget _buildHeaderSelectorButton(int id, IconData mIcon) {
return Container(
width: 70,
height: 70,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20),
color: id == selectedId ? kAccentColor : kSecondaryColor,
),
child: IconButton(
onPressed: () {
setState(() {
selectedId = id;
});
},
icon: Icon(mIcon)),
);
}
}
components/shoppingcart_detail.dart
import 'package:class_shoppingcart/constans.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class ShoppingcartDetail extends StatelessWidget {
const ShoppingcartDetail({super.key});
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.all(30.0),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(40),
topRight: Radius.circular(40),
),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
_buildDetailNameAndPrice(),
_buildDetailRatingAndReviewCount(),
_buildDetailColorOptions(),
_buildDetailButton(context),
],
),
);
}
Widget _buildDetailButton(BuildContext context) {
return TextButton(
onPressed: () {
showCupertinoDialog(
context: context,
builder: (context) {
return CupertinoAlertDialog(
title: Text('장바구니에 담으시겠습니까?'),
actions: [
CupertinoDialogAction(
child: Text('확인'),
onPressed: () {
Navigator.pop(context);
},
),
],
);
});
},
child: Text(
'Add to Cart',
style: TextStyle(
color: Colors.white,
),
),
style: TextButton.styleFrom(
backgroundColor: kAccentColor,
minimumSize: Size(300, 50),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
),
);
}
Widget _buildDetailColorOptions() {
return Padding(
padding: const EdgeInsets.only(bottom: 20.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Color Options'),
SizedBox(height: 10),
Row(
children: [
_buildDetailIcon(Colors.black),
_buildDetailIcon(Colors.green),
_buildDetailIcon(Colors.orange),
_buildDetailIcon(Colors.grey),
_buildDetailIcon(Colors.white),
],
)
],
),
);
}
Widget _buildDetailIcon(Color mColor) {
return Padding(
padding: const EdgeInsets.only(right: 20.0),
child: Stack(
children: [
Container(
width: 50,
height: 50,
decoration: BoxDecoration(
border: Border.all(),
shape: BoxShape.circle,
),
),
Positioned(
left: 5,
top: 5,
child: ClipOval(
child: Container(
width: 40,
height: 40,
color: mColor,
),
),
),
],
),
);
}
Padding _buildDetailRatingAndReviewCount() {
return Padding(
padding: const EdgeInsets.only(bottom: 20.0),
child: Row(
children: [
Icon(Icons.star, color: Colors.yellow),
Icon(Icons.star, color: Colors.yellow),
Icon(Icons.star, color: Colors.yellow),
Icon(Icons.star, color: Colors.yellow),
Icon(Icons.star, color: Colors.yellow),
Spacer(),
Text('review '),
Text(
'(26)',
style: TextStyle(color: Colors.blue),
),
],
),
);
}
Padding _buildDetailNameAndPrice() {
return Padding(
padding: const EdgeInsets.only(bottom: 10),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Urban Soft AL 10.0',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
Text(
'\$699',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
],
),
);
}
}