프로필 타일에 편집 버튼 추가 - 프로필 커스텀 화면으로 이동
메인 대시보드 프로필 카드 오른쪽 위에 작은 편집(연필) 버튼을 달아서 누르면 새로 만든 빈 커스텀 화면(ProfileCustomizeScreen)으로 이동한다. 아직은 자리만 잡아둔 화면이고, 실제 커스텀 기능들은 이후에 하나씩 추가. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+94
-61
@@ -24,6 +24,7 @@ import 'launchpad_transition.dart';
|
|||||||
import 'login_screen.dart';
|
import 'login_screen.dart';
|
||||||
import 'nfc_poccket_checkin_screen.dart';
|
import 'nfc_poccket_checkin_screen.dart';
|
||||||
import 'nfc_tag_writer_screen.dart';
|
import 'nfc_tag_writer_screen.dart';
|
||||||
|
import 'profile_customize_screen.dart';
|
||||||
import 'study_calendar_screen.dart';
|
import 'study_calendar_screen.dart';
|
||||||
import 'study_timer_screen.dart';
|
import 'study_timer_screen.dart';
|
||||||
import 'teacher_attendance_page.dart';
|
import 'teacher_attendance_page.dart';
|
||||||
@@ -632,72 +633,104 @@ class _MainDashboardState extends State<MainDashboard> {
|
|||||||
// 🪪 작은 프로필 카드로 배치 — 화면 전체를 차지하던 배너 대신
|
// 🪪 작은 프로필 카드로 배치 — 화면 전체를 차지하던 배너 대신
|
||||||
// 가운데에 떠 있는 카드 하나만 둔다.
|
// 가운데에 떠 있는 카드 하나만 둔다.
|
||||||
Center(
|
Center(
|
||||||
child: Container(
|
child: Stack(
|
||||||
padding: const EdgeInsets.symmetric(
|
clipBehavior: Clip.none,
|
||||||
horizontal: 28,
|
children: [
|
||||||
vertical: 18,
|
Container(
|
||||||
),
|
padding: const EdgeInsets.symmetric(
|
||||||
decoration: BoxDecoration(
|
horizontal: 28,
|
||||||
color: theme.color,
|
vertical: 18,
|
||||||
borderRadius: BorderRadius.circular(24),
|
|
||||||
boxShadow: [
|
|
||||||
BoxShadow(
|
|
||||||
color: theme.color.withValues(alpha: 0.25),
|
|
||||||
blurRadius: 16,
|
|
||||||
offset: const Offset(0, 6),
|
|
||||||
),
|
),
|
||||||
],
|
decoration: BoxDecoration(
|
||||||
),
|
color: theme.color,
|
||||||
child: Column(
|
borderRadius: BorderRadius.circular(24),
|
||||||
mainAxisSize: MainAxisSize.min,
|
boxShadow: [
|
||||||
children: [
|
BoxShadow(
|
||||||
Text(
|
color: theme.color.withValues(alpha: 0.25),
|
||||||
theme.title,
|
blurRadius: 16,
|
||||||
style: const TextStyle(
|
offset: const Offset(0, 6),
|
||||||
fontWeight: FontWeight.bold,
|
),
|
||||||
letterSpacing: 1.2,
|
],
|
||||||
color: Colors.white,
|
|
||||||
fontSize: 13,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
const SizedBox(height: 10),
|
child: Column(
|
||||||
Container(
|
mainAxisSize: MainAxisSize.min,
|
||||||
padding: const EdgeInsets.all(4),
|
children: [
|
||||||
decoration: const BoxDecoration(
|
Text(
|
||||||
color: Colors.white,
|
theme.title,
|
||||||
shape: BoxShape.circle,
|
style: const TextStyle(
|
||||||
),
|
fontWeight: FontWeight.bold,
|
||||||
child: CircleAvatar(
|
letterSpacing: 1.2,
|
||||||
radius: 22,
|
color: Colors.white,
|
||||||
backgroundColor: AppPalette.linen,
|
fontSize: 13,
|
||||||
child: Icon(
|
),
|
||||||
theme.icon,
|
),
|
||||||
size: 22,
|
const SizedBox(height: 10),
|
||||||
color: theme.color,
|
Container(
|
||||||
|
padding: const EdgeInsets.all(4),
|
||||||
|
decoration: const BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
shape: BoxShape.circle,
|
||||||
|
),
|
||||||
|
child: CircleAvatar(
|
||||||
|
radius: 22,
|
||||||
|
backgroundColor: AppPalette.linen,
|
||||||
|
child: Icon(
|
||||||
|
theme.icon,
|
||||||
|
size: 22,
|
||||||
|
color: theme.color,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 10),
|
||||||
|
Text(
|
||||||
|
'$_displayName 님',
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: const TextStyle(
|
||||||
|
fontSize: 17,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 3),
|
||||||
|
Text(
|
||||||
|
theme.subtitle,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.white.withValues(alpha: 0.8),
|
||||||
|
fontSize: 12,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Positioned(
|
||||||
|
top: -6,
|
||||||
|
right: -6,
|
||||||
|
child: Material(
|
||||||
|
color: AppPalette.paper,
|
||||||
|
shape: const CircleBorder(),
|
||||||
|
elevation: 2,
|
||||||
|
child: InkWell(
|
||||||
|
customBorder: const CircleBorder(),
|
||||||
|
onTap: () => pushLaunchpad(
|
||||||
|
context,
|
||||||
|
(context) => ProfileCustomizeScreen(
|
||||||
|
studentId: _displayId,
|
||||||
|
studentName: _displayName,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: const Padding(
|
||||||
|
padding: EdgeInsets.all(8),
|
||||||
|
child: Icon(
|
||||||
|
Icons.edit_rounded,
|
||||||
|
size: 16,
|
||||||
|
color: AppPalette.ink,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 10),
|
),
|
||||||
Text(
|
],
|
||||||
'$_displayName 님',
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
style: const TextStyle(
|
|
||||||
fontSize: 17,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
color: Colors.white,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 3),
|
|
||||||
Text(
|
|
||||||
theme.subtitle,
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
style: TextStyle(
|
|
||||||
color: Colors.white.withValues(alpha: 0.8),
|
|
||||||
fontSize: 12,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 28),
|
const SizedBox(height: 28),
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
// 🎨 프로필 커스텀 화면 (UI 전용). 아직은 자리만 잡아둔 빈 화면 - 프로필 꾸미기
|
||||||
|
// 관련 기능들이 여기에 하나씩 추가될 예정이다.
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import '../theme/app_palette.dart';
|
||||||
|
import 'title_pill.dart';
|
||||||
|
|
||||||
|
class ProfileCustomizeScreen extends StatelessWidget {
|
||||||
|
final String studentId;
|
||||||
|
final String studentName;
|
||||||
|
|
||||||
|
const ProfileCustomizeScreen({
|
||||||
|
super.key,
|
||||||
|
required this.studentId,
|
||||||
|
required this.studentName,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
backgroundColor: AppPalette.mist,
|
||||||
|
appBar: AppBar(
|
||||||
|
backgroundColor: Colors.transparent,
|
||||||
|
foregroundColor: AppPalette.ink,
|
||||||
|
elevation: 0,
|
||||||
|
centerTitle: true,
|
||||||
|
title: const TitlePill('프로필 꾸미기'),
|
||||||
|
),
|
||||||
|
body: Center(
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(24),
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
const Icon(
|
||||||
|
Icons.auto_awesome_rounded,
|
||||||
|
size: 48,
|
||||||
|
color: AppPalette.ink,
|
||||||
|
),
|
||||||
|
const SizedBox(height: 16),
|
||||||
|
const Text(
|
||||||
|
'곧 다양한 프로필 커스텀 기능이 추가될 예정이에요.',
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 6),
|
||||||
|
Text(
|
||||||
|
'$studentName ($studentId)',
|
||||||
|
style: const TextStyle(color: Colors.grey),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user